Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

30.6.2. VDO アーキテクチャーの背景

VDO カーネルドライバーはマルチスレッドで、複数の同時 I/O 要求間で処理コストを昇格してパフォーマンスを向上します。1 つのスレッド処理から終了まで I/O リクエストを処理するのではなく、さまざまな作業ステージを 1 つまたは複数のスレッドまたはスレッドグループに委譲し、メッセージ間で I/O リクエストとして渡されるメッセージがパイプラインを介して行われます。これにより、1 つのスレッドが、I/O 操作が処理されるたびにロックおよびロックを解除することなく、グローバルデータ構造へのすべてのアクセスをシリアライズできます。VDO ドライバーが適切に調整されると、スレッドが要求された処理ステージを完了するたびに、通常、同じ処理のために別のリクエストがキューに置かれます。これらのスレッドをビジー状態に維持すると、コンテキストの切り替えおよびスケジューリングのオーバーヘッドが低くなるため、パフォーマンスが向上します。独立したスレッドは、オペレーティングシステムの複数の部分にも使用されます。たとえば、基礎となるストレージシステムや UDS への I/O 操作のキューに入れるなど、ブロックすることができます。
VDO が使用するさまざまなワーカースレッドタイプは次のとおりです。
論理ゾーンスレッド
kvdo:logQ などのプロセス名を持つ 論理 スレッドは、VDO デバイスのユーザーに提示する論理ブロック番号(LBN)と基となるストレージシステムの物理ブロック番号(PBN)間のマッピングを維持します。また、同じブロックへの書き込みを試みる 2 つの I/O 操作は同時に処理されない、ロックを実装しています。論理ゾーンスレッドは、読み取りおよび書き込み両方の操作時にアクティブになります。
LBN はチャンクに分割されます( ブロックマップページには 3 MB を超える LBN よりビットが含まれる)、これらのチャンクはスレッド間で分割される ゾーン にグループ化されます。
処理がスレッド全体でかなり均等に分散されるはずですが、アクセスパターンの一部が 1 つのスレッドまたは別のスレッドで集中される場合もあります。たとえば、指定のブロックマップページ内で LBN に頻繁にアクセスすると、論理スレッドの 1 つがそれらのすべての操作を処理します。
論理ゾーンスレッドの数は、vdo コマンドの --vdoLogicalThreads=thread count オプションを使用して制御できます。
物理ゾーンスレッド
physical または kvdo:physQ、スレッドはデータブロック割り当てを管理し、参照数を維持します。これらは書き込み操作中にアクティブになります。
LBN と同様に、PBN は スラブ と呼ばれるチャンクに分割されます。
物理ゾーンスレッドの数は、vdo コマンドの --vdoPhysicalThreads=thread count オプションを使用して制御できます。
I/O 提出スレッド
kvdo:bioQ スレッドは、VDO からストレージシステムにブロック I/O(bio)操作を送信します。他の VDO スレッドによってキューに格納された I/O 要求を取得し、基盤のデバイスドライバーに渡します。これらのスレッドは、デバイスに関連するデータ構造と通信および更新したり、デバイスドライバーのカーネルスレッドが処理するように要求を設定したりできます。I/O リクエストの送信は、基となるデバイスの要求キューが満杯の場合にブロックする可能性があるため、この作業は専用のスレッドによって行われ、処理の遅延を回避できます。
このスレッドが ps または top ユーティリティーにより D 状態で頻繁に表示されると、VDO は I/O 要求でビジーストレージシステムを頻繁に維持します。これは通常、一部の SSD がパイプライン化される可能性があるため、ストレージシステムが並列して複数の要求を処理できる場合、または要求処理がパイプラインされている場合に適しています。これらの期間にスレッドの CPU 使用率が非常に低い場合、I/O 提出スレッドの数を減らすことができる可能性があります。
CPU の使用率とメモリーの競合は、VDO の下にあるデバイスドライバーによって異なります。スレッドが追加されると、I/O 要求ごとの CPU 使用率が増加すると、これらのデバイスドライバーで CPU、メモリー、またはロック競合の有無を確認します。
I/O 提出スレッドの数は、vdo コマンドの --vdoBioThreads=thread count オプションを使用して制御できます。
cpu-processing スレッド
kvdo:cpuQ スレッドは、計算ハッシュ値や、ブロックされないデータブロックを圧縮したり、他のスレッドタイプに関連するデータ構造への排他的アクセスを要求するなどの CPU 集約型の作業を実行するために存在します。
CPU 処理スレッドの数は、vdo コマンドの --vdoCpuThreads=thread count オプションを使用して制御できます。
I/O 確認済みスレッド
kvdo:ackQ スレッドは、I/O 要求の完了を報告します。CPU 時間の要件とメモリーの競合は、この他のカーネルレベルのコードによって異なります。
確認済みスレッドの数は、vdo コマンドの --vdoAckThreads=thread count オプションを使用して制御できます。
スケーリング不可 VDO カーネルスレッド:
重複排除スレッド
kvdo:dedupeQ スレッドは、キューに格納された I/O リクエストを取り、UDS に連絡します。ソケットバッファーは、サーバーが迅速に要求に対応できない場合や、他のシステムアクティビティーによってカーネルメモリーが制限されている場合は、スレッドをブロックする必要がある場合は、別のスレッドによってこの作業が行われ、他の VDO 処理を続行できます。長い遅延(秒)の後に I/O 要求をスキップするタイムアウトメカニズムもあります。
ジャーナルスレッド
kvdo:journalQ スレッドはリカバリージャーナルを更新し、書き込み用に journal ブロックをスケジュールします。VDO デバイスはジャーナルを 1 つだけ使用しているため、この作業をスレッド全体で分割することはできません。
Packer スレッド
圧縮が有効な場合に書き込みパスでアクティブな kvdo:packerQ スレッドは、k vdo:cpuQ スレッドによって圧縮されるデータブロックを収集し、領域を最小限に抑えます。パックのデータ構造が 1 つあり、つまり VDO デバイスごとに 1 つのパックスレッドがあります。