web-dev-qa-db-ja.com

Linuxディスクのフラッシュ間隔を調整して、ユーザープロセスのブロックを回避します

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秒ごとにフラッシュするだけで十分でしょう。

4
patraulea

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/

3
Ludovic Ronsin