低速(HDD)および高速(SSD)ドライブにわたって複数のディスクとソフトウェアRAIDを備えた最新のLinuxシステムでファイルシステムへの書き込みをキャッシュする方法は?
md-raid RAID1を使用すると、アレイをおよびとして構成できます--write-mostly
。--write-behind
つまり、高速ディスクでの読み取りが行われ、遅いディスクへの書き込みが遅れる可能性があります。しかし、カーネルレベルではどのようにキャッシュされますか?カーネルキャッシュディスクは、md-raidレイヤの前または後に記録しますか? write()呼び出しの終わりに、ディスクではなくディスクの1つにデータが書き込まれることを保証しますか--write-behind
?
RAID1でもbtrfs
同じ状況がどのように発生しますか?機能がないため、--write-behind
ダーティページはデバイスレベルまたはファイルシステムレベルで計算されますか? write() はいつ返されますか?
vm.dirty_*ratio
調整可能なパラメータはこれらの設定にどのような影響を与えますか?
答え1
--write-mostly
、ドライバによって内部的に処理されます--write-behind
。デフォルトでは、どのデータが書き込まれていて、どのデータがまだ失われているかを書き込む書き込み意図ビットマップ(後の書き込み機能に必要)などのメタデータが保存されます。これは、データが既定の書き込みデバイスに到達していない状態で停電が発生した場合に必要です。この場合、影響を受けたデータ領域は再同期されます(あなたの場合はSSDから読み取られ、HDDに書き込まれます)。md
md
しかし、カーネルレベルではどのようにキャッシュされますか?
write-behindの場合、mdドライバはデフォルトで書き込み要求を内部的に複製します。デフォルトの書き込み要求はプライマリドライブに送信され、上位レイヤに「OK、完了しました」と通知します。その後、複製された書き込み要求はRAIDの背面書き込み側に保持され、完了するのに長い時間がかかることがあります。一通のお知らせが届きます。
その後、RAID層は、キューに保留中の書き込み要求がある間に書き込み優先デバイスからデータを読み取らないようにいくつかの手順を実行します。書き込み指向デバイスからデータを読み取るのはなぜですか?まあ、SSDが故障した可能性があるので、残っているのはそれです。複雑でwrite-behindのためにいくつかの特別なケースが発生します。
これがおそらくRAID-1レベルのみをサポートし、他のレベルはサポートしていない理由です。理論的には、本質的にSSDをRAID-0として使用し、write-behindモードで2つのパリティHDDを使用することは合理的ですが、このようなwrite-behind RAID-6はサポートされていません。 RAID-1専用で、そこでもほとんど使用されません。
md
他のキャッシュ設定はこれに影響されません。デフォルトでは、キャッシングメカニズム全体は、ドライバが内部的にどのように実装するのか全く気にしません。キャッシュがその仕事をし、mdがその仕事をします。したがって、ファイルシステムキャッシュは、ベアドライブと同様に、mdの上にあるファイルシステムでも同じように機能します。 (もう少し複雑ですが、こう考えてください。)
答え2
md-raid RAID1を使用すると、アレイをおよびとして構成できます
--write-mostly
。--write-behind
つまり、高速ディスクでの読み取りが行われ、遅いディスクへの書き込みが遅れる可能性があります。しかし、カーネルレベルではどのようにキャッシュされますか?カーネルキャッシュディスクは、md-raidレイヤの前または後に記録しますか?
それ以降は、この機能はmd-raid専用です。
この md-raid 機能はキャッシュではなくバッファリングと考える必要があります。mdadm
次のオプションに制限されます。
--後ろに書く=
write-behind モードを有効にすることを指定します (RAID1 のみ有効)。パラメーターを指定すると、許容される未解決書き込みの最大数が設定されます。デフォルト値は 256 です。
私はそれが一般的なカーネルとハードウェアバッファリング(つまりより小さい場合)によっても制限されると仮定できます。一般的なカーネルバッファリングはnr_requests
。max_hw_sectors_kb
より/sys/class/block/$write_behind_device/queue/
。ハードウェアバッファリングは、ドライブの書き込みキャッシュを表します。
write()呼び出しの終わりに、ディスクではなくディスクの1つにデータが書き込まれることを保証しますか
--write-behind
?
もちろん、これはO_SYNC / O_DSYNCで開かれたファイルのwrite()を意味するか、実際にはwrite()+ fsync()を意味すると仮定します。そうでない場合、まったく保証はありません。