デバイスごとのディスク書き込みキャッシュのサイズを制限できますか?

デバイスごとのディスク書き込みキャッシュのサイズを制限できますか?

私のデフォルトのデスクトップには64GBのRAMがあります。これにより、ファイルのコピーやネットワーク転送など、ディスクの大量使用中にダーティライトキャッシュが10 GBを超えることが頻繁に発生するようです。 (転送前のDirty/proc/meminfo(0または非常に近い値)と転送中の値(10GB以上)を観察してこの値を収集しました。)SSDから起動しますが、大容量データ転送は外付けハードドライブによって処理されます。例外的なドライブの平均書き込み速度は約100 MB /秒ですが、私は10 Gbitネットワークを介してZFSアレイベースのNASに接続されているため、LAN経由で> 400 MB /秒の帯域幅が一般的です。

これの問題は、マルチタスク中であり、他のタスクがタスクを実行している場合sync(たとえば、タスクが完了する前にタスクを実行するのと似ているとapt思います)、プロセス全体が数分間中断される可能性があることです。さらに、書き込みプロセスはまだ書き込み中であるため、ダーティキャッシュをクリアするのにかかる時間よりも同期に時間がかかることがあります。これはシステムの他の面でも明らかであった。つまり、転送中にアプリケーションがランダムに遅延または中断する現象が発生しました。dpkgsync

ハードドライブの場合でも、10GBの書き込みキャッシュはかなり大きいです。私のNVMeブートSSDの場合、1GB /秒以上の書き込みを達成すると問題はないかもしれませんが、比較的遅いドライブでは新しい書き込みが発生しないと仮定すると、同期時間が2分を超える可能性があります。非常に大きな転送が発生した場合、同期コマンドが10分以上遅れることがわかります。

特定のデバイスが送信できるデータ量を制限するようにLinuxカーネルに指示する方法はありますか? (たとえば、データを強制的にディスクにフラッシュする前に、キャッシュに512 MBのデータのみを許可するようにカーネルに指示できれば、この状況に非常に役立ちます。)これが失敗した場合は、システムを下げながら生きることができます。 - ワイド書き込みキャッシュがありますが、何をすべきかわかりません。

答え1

デバイス固有の書き込みキャッシュはまだ実装されていません。あなたが言う問題はよく知られています。私は5年前にこう言いました。2013年に「USBフラッシュドライブの停止」の問題が発生したのはなぜですか?既存の「I / Oダーティスロットリングなし」コードがこの問題を解決できないのはなぜですか?

まだ64GiBのRAMがあるので、次のように問題を直接解決しました。

cat /etc/sysctl.d/dirty.conf
# Per Torvalds advice
vm.dirty_background_bytes = 33554432
vm.dirty_bytes = 134217728

一部のジョブの実行が少し遅くなることがありますが、問題は解決します。

関連情報