如何更改作業系統文件快取刷新策略?

  • 2020 年 1 月 30 日
  • 筆記

環境說明

以下針對linux作業系統,在centos/RHEL 6、centos/RHEL 7上測試有效。

相關參數

和文件系統寫快取策略相關的主要是下面兩個參數,其它相關參考可自行Google:

/proc/sys/vm/dirty_ratio

文件系統寫緩衝區的大小,單位是百分比,表示系統記憶體的百分比,表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出數據。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫性能。但是,當需要持續、恆定的寫入時,應該降低其數值。

/proc/sys/vm/dirty_background_ratio

控制 pdflush 進程在何時刷新磁碟。單位是百分比,表示系統記憶體的百分比,意思是當寫緩衝使用到系統記憶體多少的時候, pdflush 開始向磁碟寫出數據。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫性能。但是,當需要持續、恆定的寫入場合時,應該降低其數值。

對比說明

vm.dirty_background_ratio: 這個參數指定了當文件系統快取臟頁數量達到系統記憶體百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後台回寫進程運行,將一定快取的臟頁非同步地刷入外存;

vm.dirty_ratio: 而這個參數則指定了當文件系統快取臟頁數量達到系統記憶體百分之多少時(如10%),系統不得不開始處理快取臟頁(因為此時臟頁數量已經比較多,為了避免數據丟失需要將一定臟頁刷入外存);在此過程中很多應用進程可能會因為系統轉而處理文件IO而阻塞。

正常都是先達到vm.dirty_background_ratio的條件然後觸發flush進程進行非同步的回寫操作,但是這一過程中應用進程仍然可以進行寫操作,如果多個應用進程寫入的量大於flush進程刷出的量那自然會達到vm.dirty_ratio這個參數所設定的坎,此時作業系統會轉入同步地處理臟頁的過程,阻塞應用進程。

也就是說,正常vm.dirty_background_ratio < vm.dirty_ratio才有意義。

在經常有大量寫入操作的系統中,應該分別調低這兩個參數的值,加快數據刷盤的頻率,從而避免因系統同步處理文件IO而導致相關進程處於D狀態。

參數修改方法

臨時生效方法(重啟後失效):

echo 5 >/proc/sys/vm/dirty_background_ratio  echo 10 >/proc/sys/vm/dirty_ratio

或者

sysctl -w vm.dirty_background_ratio=5  sysctl -w vm.dirty_ratio=10

永久生效方法:

echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf  echo "vm.dirty_ratio = 10" >> /etc/sysctl.conf  sysctl -p /etc/sysctl.conf

參考: http://blog.sina.com.cn/s/blog_448574810101k1va.html