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