第6章 VDO パフォーマンスの最適化
VDO カーネルドライバーは、複数のスレッドを使用してタスクを高速化します。1 つのスレッドが I/O リクエストのすべてを実行するのではなく、作業を小さく分割し、異なるスレッドに割り当てます。これらのスレッドは、リクエストを処理する際に相互に通信します。このようにして、1 つのスレッドで、頻繁にロックやロック解除を行うことなく共有データを処理できます。
1 つのスレッドがタスクを完了した時点で、VDO はすでに別のタスクを用意しています。これにより、スレッドがビジー状態に保たれ、タスクの切り替えにかかる時間が短縮されます。VDO は、キューへの I/O 操作の追加や重複排除インデックスへのメッセージの処理など、低速のタスクにも別のスレッドを使用します。
6.1. VDO スレッドの種類
VDO は、さまざまなスレッドタイプを使用して特定の操作を処理します。
- 論理ゾーンスレッド (
kvdo:logQ
) - VDO デバイスのユーザーに提示される論理ブロック番号 (LBN) と、基盤となるストレージシステムの物理ブロック番号 (PBN) の間のマッピングを維持します。また、同じブロックへの同時書き込みも防止します。論理スレッドは、読み取り操作と書き込み操作の両方でアクティブになります。処理は通常均等に分散されますが、特定のアクセスパターンにより、1 つのスレッドに作業が集中する場合があります。たとえば、特定のブロックマップページ内の LBN に頻繁にアクセスすると、1 つの論理スレッドがそれらすべての操作を処理する可能性があります。
- 物理ゾーンスレッド (
kvdo:physQ
) - 書き込み操作中にデータブロックの割り当てと参照カウントを処理します。
- I/O 送信スレッド (
kvdo:bioQ
) -
VDO からストレージシステムへのブロック I/O (
bio
) 操作の転送を処理します。これらのスレッドは、他の VDO スレッドからの I/O リクエストを処理し、基盤となるデバイスドライバーに渡します。これらのスレッドは、デバイス関連のデータ構造と対話し、デバイスドライバーカーネルスレッドのリクエストを作成し、デバイスリクエストキューがいっぱいになって I/O リクエストがブロックされた場合の遅延を防ぎます。 - CPU 処理スレッド (
kvdo:cpuQ
) - 他のスレッドタイプのデータ構造をブロックしない、またはデータ構造への排他的アクセスを必要としない、CPU 集中型のタスクを処理します。これらのタスクには、ハッシュ値の計算とデータブロックの圧縮が含まれます。
- I/O 完了通知スレッド (
kvdo:ackQ
) - I/O リクエストの完了を、カーネルページキャッシュやダイレクト I/O を実行するアプリケーションスレッドなどの上位コンポーネントに通知します。メモリー競合への影響と CPU 使用率は、カーネルレベルのコードによる影響を受けます。
- ハッシュゾーンスレッド (
kvdo:hashQ)
- 一致するハッシュを使用して I/O リクエストを調整し、潜在的な重複排除タスクを処理します。重複排除リクエストを作成および管理しますが、重要な計算は実行しません。通常、ハッシュゾーンスレッドは 1 つで十分です。
- 重複排除スレッド (
kvdo:dedupeQ
) - I/O リクエストを処理し、重複排除インデックスと通信します。この作業はブロッキング状態を防ぐために別のスレッドで実行されます。また、インデックスがすぐに応答しない場合に重複排除をスキップするタイムアウトメカニズムも備えています。重複排除スレッドは VDO デバイスごとに 1 つだけ存在します。
- ジャーナルスレッド (
kvdo:journalQ
) - リカバリージャーナルを更新し、ジャーナルブロックの書き込みをスケジュールします。このタスクを複数のスレッドに分割することはできません。ジャーナルスレッドは VDO デバイスごとに 1 つだけ存在します。
- パッカースレッド (
kvdo:packerQ
) - 圧縮が有効になっている場合、書き込み操作中に機能します。CPU スレッドから圧縮されたデータブロックを収集して、無駄な領域を削減します。パッカースレッドは VDO デバイスごとに 1 つだけ存在します。