異なる速度のディスクにまたがるファイルシステムで書き込みキャッシュはどのように機能しますか?


9

複数のディスクと、低速(HDD)ドライブと高速(SSD)ドライブの両方にまたがるソフトウェアRAIDを備えた最新のLinuxシステムでは、ファイルシステムへの書き込みはどのようにキャッシュされますか?

MD-RAID RAID1の配列は次のようにディスクを構成することができる--write-mostly--write-behindそれが速いディスクから実行される読み出しを示唆している、より遅いディスクへの書き込みが遅れることができます。しかし、それはカーネルレベルでどのようにキャッシュされるのでしょうか。カーネルは、md-raidレイヤーの前または後にディスク書き込みをキャッシュしますか?write()呼び出しの最後に、データが非--write-behindディスクの1つに書き込まれることが保証されていますか?

以下のためにbtrfsRAID1どのように同じような状況が出て遊ぶでしょうか?--write-behind機能がないため、ダーティページはデバイスレベルまたはファイルシステムレベルでカウントされますか?write()はどの時点で戻りますか?

vm.dirty_*ratio調整パラメータはこれらの設定にどのように影響しますか?

回答:


7

--write-mostly--write-behindによって処理されmd、内部ドライバ。mdメタデータを保持します。ライトインテントビットマップ(ライトビハインド機能では必須)のように、基本的には、どのデータがまだ書き込まれているか、どのデータがまだ失われているかをログに記録します。これは、データがまだ書き込みデバイスに到達していないときに電力損失イベントが発生した場合に必要です。その場合、影響を受けるデータ領域が再同期されます(あなたの場合、SSDから読み取り、HDDに書き込みます)。

しかし、それはカーネルレベルでどのようにキャッシュされるのでしょうか。

後書きの場合、mdドライバーは基本的に書き込み要求を内部で複製します。マスター書き込みリクエストはプライマリドライブに送信され、上位層に「これはすでに実行済みです」と伝えます。コピーされた書き込み要求は、RAIDの書き込みの最も後ろ側にとどまり、完了に時間がかかる可能性があります。

次に、レイド層は多くの手順を実行して、キューに保留中の後書き要求がまだある間に、ほとんどのデバイスからデータが読み取られないようにします。ほとんどの場合、書き込みデバイスからデータが読み取られるのはなぜですか?さて、SSDが故障した可能性があるため、残りはすべてです。それは複雑で、後書きはいくつかのコーナーケースを導入します。

これがおそらくRAID-1レベルでのみサポートされ、他のレベルではサポートされない理由でもあります。理論的にはSSDを基本的にRAID-0として、2つのパリティHDDを後書きモードで使用することは理にかなっていますが、そのような後書きRAID-6はサポートされていません。これはRAID-1のみで、そこでもめったに使用されません。

他のキャッシュ設定はこれによる影響を受けません。基本的に、全体的なキャッシングメカニズムは、mdドライバーが内部でどのように物事を実装したかについてはほとんど気にしません。キャッシュはその役割を果たし、mdはその役割を果たします。したがって、ファイルシステムキャッシュは、md上のファイルシステムとベアドライブ上のファイルシステムで同じように機能します。(現実はそれより少し複雑ですが、このように考えることができます。)


3

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()呼び出しの最後に、データが非--write-behindディスクの1つに書き込まれることが保証されていますか?

もちろん、write()がO_SYNC / O_DSYNCで開かれたファイル上にあること、または実際にwrite()+ fsync()を意味することを想定しています。そうでない場合、保証は一切適用されません。


おかげで、しかしそれは別の質問を提起します:ファイルがO_SYNCで開かれた場合、最初のディスクが書き込まれた後、またはこの場合すべてのディスクが書き込まれた後に、write()は戻りますか?
Steven Davies

3
ライトビハインド以外のディスクへのサブ書き込みは、最初に完了する必要があります
sourcejedi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.