web-dev-qa-db-ja.com

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

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

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

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

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

9
Steven Davies

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

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

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

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

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

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

7
frostschutz

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

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

3
sourcejedi