最初に尋ねる質問は、あなたが経験している問題は正確には何ですか? カーネルはダーティ (未書き込みのキャッシュ) バッファーを定期的にフラッシュします。これは、同期的にフラッシュするよりも高速になる傾向があるためです (アプリケーションのレイテンシーヒットが少なくなります)。欠点は、ダーティ データに対するカーネルの制限に達した場合に、レイテンシ ヒットが大きくなることを意味することです (また、クリーンでないシャットダウンの後により多くのデータ損失が発生する可能性があります)。
データができるだけ早くディスクにヒットするようにしたい場合は、O_SYNC
オプションを使用してファイルを開くだけです。これにより、すぐにデータがディスクにフラッシュされますwrite()
。もちろん、これはパフォーマンスが大幅に低下することを意味しますが、一方で、データがフラッシュされるタイミングを完全に制御できます。
同期中にスループットが低下する場合は、ディスクがサポートできる速度よりも速く書き込もうとしており、ダーティ ページ メモリの制限に達している可能性があります。残念ながら、これは、ハードウェアがプッシュしようとしている書き込み速度に達していないことを意味します.書き込み速度を遅くするか、より高速なメディアにデータをバッファリングする必要があります(またはRAMを追加してください!)。
また、'smart fsync' はまさにカーネルが実装するものであることに注意してください。次のいずれかに該当する場合にページをフラッシュします: * メモリ内にダーティ データが多すぎる。ダーティ データの合計量が を超える/proc/sys/vm/dirty_background_bytes
か、合計メモリのパーセンテージが を超えると、(書き込みをブロックせずに) 非同期的にトリガーされます/proc/sys/vm/dirty_background_ratio
。データの合計量が を超えるか、合計メモリのパーセンテージが を超えると、同期的にトリガーされます (アプリケーションwrite()
を長時間ブロックします) 。* ダーティ データがメモリ内で長時間保留されています。デーモンはセンチ秒 (1/100 秒) ごとに古いダーティ ブロックをチェックし 、 ./proc/sys/vm/dirty_bytes
/proc/sys/vm/dirty_ratio
pdflush
/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
これらのパラメーターを調整することで少しは役立つ可能性がありますが、デフォルトがそのまま維持されない理由を突き止めたほうがよいでしょう。