Rtorrentを使用してRaspberryPiにマウントされたSDカードに約6MB /秒(帯域幅の上限)でファイルをダウンロードしています。ユーザープロセスはデータ自体をフラッシュしません。ディスクキャッシュがフラッシュされる間隔は、sysctl値によって異なります。
Iostatとnloadを使用すると、ネットワーク帯域幅とディスク書き込みプロファイルを確認できます。
ディスク:
20M/s .....x.....x....xx...
.....x....xx....xx...
....xx....xx....xx...
0M/s ....xx....xx....xx...
通信網:
5M/s ..xxx....x.. x.....x.
.xxxx...xx..xxx...xxx
0M/s xxxxx...xxx.xxx...xxx
どうやらIOライターはフラッシュ中は常に一時停止しています。これは3コアが永続的にアイドル状態の4コアCPUであり、topはフラッシュ中に100%iowaitと表示します。
私が行った場合 while true; do sync; sleep 1; done
ダウンロード中、ディスクのフラッシュは毎秒6MBでスムーズです。また、ダウンローダープロセスがチョークされないため、帯域幅は一定です。
私は同じ効果を得ることができます:
/proc/sys/vm/dirty_writeback_centisecs:
ディスクキャッシュのフラッシュが開始される頻度-単位は数百秒です。デフォルト:500
および/proc/sys/vm/dirty_expire_centisecs:
数百秒でフラッシュできるようにするには、ページが何歳である必要がありますか。デフォルト:3000
これらをそれぞれ100と200に設定すると、同じ均一なディスクフラッシュプロファイルと一定のダウンロード帯域幅が実現されます。
このチューニングを自動化する方法はありますか?つまり、ライタープロセスをブロックする必要がないように、できるだけ頻繁にフラッシュしますか?たとえば、ダウンロード速度が1MB /秒の場合、5秒ごとにフラッシュするだけで十分でしょう。
Linuxカーネルは、dirty_writeback_centisecs
より古いダーティページがあるかどうかをdirty_expire_centisecs
でチェックします。デフォルト設定では、30秒より古いダーティページがないか5秒ごとにチェックします。
カーネルにはダーティメモリ制限もあります。この制限に達すると、RAMにダーティページが多すぎるのを防ぐために、すべてのライタープロセスがブロックされます。
調整する必要があるのは
vm.dirty_background_ratio
:カーネルがバックグラウンドでディスクへのフラッシュを開始する前にダーティページで埋めることができるシステムメモリの量。vm.dirty_ratio
:ダーティページで埋めることができる最大システムメモリ。次に、カーネルは、すべてがディスクにフラッシュされるまで、すべてのI/O要求をブロックします。この動作を起こさないようにするには、カーネルに少なくとも30s * 6MB/s = 180MBを保持するように指示する必要があります。また、Raspberry Piの書き込み速度が遅いことも考慮する必要があります。これは、ディスクへのフラッシュに必要な時間中に、より多くのダーティページがRAMに書き込まれるためです。
これは、RaspberryPiのRAMを表しすぎる可能性があるため、dirty_expire_centisecs
を下げる必要がある場合があります。小さい値を使用すると、ほぼ同期するため、システムの応答性が損なわれる可能性があることに注意してください。 I/O。
これがどのように機能するかについてのより完全な説明は次のとおりです: https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/