問題現象: 問題原因: 預設情況下, Linux會最多使用40%的可用記憶體作為文件系統緩存。當超過這個閾值後,文件系統會把將緩存中的記憶體全部寫入磁碟, 導致後續的IO請求都是同步的。 將緩存寫入磁碟時,有一個預設120秒的超時時間。 出現上面的問題的原因是IO子系統的處理速度不夠快,不能在120秒將 ...
問題現象:
問題原因:
預設情況下, Linux會最多使用40%的可用記憶體作為文件系統緩存。當超過這個閾值後,文件系統會把將緩存中的記憶體全部寫入磁碟, 導致後續的IO請求都是同步的。
將緩存寫入磁碟時,有一個預設120秒的超時時間。 出現上面的問題的原因是IO子系統的處理速度不夠快,不能在120秒將緩存中的數據全部寫入磁碟。
IO系統響應緩慢,導致越來越多的請求堆積,最終系統記憶體全部被占用,導致系統失去響應。
解決辦法:
根據應用程式情況,對vm.dirty_ratio,vm.dirty_background_ratio兩個參數進行調優設置。 例如,推薦如下設置:
# sysctl -w vm.dirty_ratio=10
# sysctl -w vm.dirty_background_ratio=5
# sysctl -p
如果系統永久生效,修改/etc/sysctl.conf文件。加入如下兩行:
#vi /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
重啟系統生效
附錄:
vm.dirty_background_ratio:這個參數指定了當文件系統緩存臟頁數量達到系統記憶體百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將一定緩存的臟頁非同步地刷入外存; vm.dirty_ratio:而這個參數則指定了當文件系統緩存臟頁數量達到系統記憶體百分之多少時(如10%),系統不得不開始處理緩存臟頁(因為此時臟頁數量已經比較多,為了避免數據丟失需要將一定臟頁刷入外存);在此過程中很多應用進程可能會因為系統轉而處理文件IO而阻塞。 先達到vm.dirty_background_ratio的條件然後觸發flush進程進行非同步的回寫操作,但是這一過程中應用進程仍然可以進行寫操作,如果多個應用進程寫入的量大於flush進程刷出的量那自然會達到vm.dirty_ratio這個參數所設定的坎,此時操作系統會轉入同步地處理臟頁的過程,阻塞應用進程。