問題描述:
發現主機夯死,重啓後,查看系統性能信息,發現跟平常無差異(內存使用率一直在99%)
查看系統errors日誌:
kernel: INFO: task kthreadd:2 blocked for more than 120 seconds.
kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
初步確定是髒頁緩存過多觸發主機pdflush,造成主機夯死。
linux會設置40%的可用內存用來做系統cache,當flush數據時這40%內存中的數據由於和IO同步問題導致超時(120s),所將40%減小到10%,避免超時。
vm.dirty_background_ratio = 10
系統設置:
[root@ly-idc-core-platform-201711131-vm010 log]# sysctl -a|grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
1 數據在頁緩存中是否超出30秒,如果是,標記爲髒頁緩存;
2 髒頁緩存是否達到工作內存的10%;
3 總內存的最大百分比,系統所能擁有的最大髒頁緩存的總量。超過這個值,開啓pdflush寫入硬盤。如果cache增長快於pdflush,那麼整個系統在40%的時候遇到I/O瓶頸,所有的I/O都要等待cache被pdflush進硬盤後才能重新開始。
pdflush的第一件事是讀取
/proc/sys/vm/dirty_expire_centiseconds (default 3000)
1/100秒。緩存頁裏數據的過期時間(舊數據),在下一個週期內被寫入硬盤。默認30秒是一個很長的時間。
第二件事是判斷內存是否到了要寫入硬盤的限額,由參數決定:
/proc/sys/vm/dirty_background_ratio (default 10)
百分值,保留過期頁緩存(髒頁緩存)的最大值。是以MmeFree+Cached-Mapped的值爲基準的
pdflush寫入硬盤看兩個參數:
1 數據在頁緩存中是否超出30秒,如果是,標記爲髒頁緩存;
2 髒頁緩存是否達到工作內存的10%;
以下參數也會影響到pdflush
/proc/sys/vm/dirty_ratio (default 40)
總內存的最大百分比,系統所能擁有的最大髒頁緩存的總量。超過這個值,開啓pdflush寫入硬盤。如果cache增長快於pdflush,那麼整個系統在40%的時候遇到I/O瓶頸,所有的I/O都要等待cache被pdflush進硬盤後才能重新開始。
對於有高度寫入操作的系統
dirty_background_ratio: 主要調整參數。如果需要把緩存持續的而不是一下子大量的寫入硬盤,降低這個值。
dirty_ratio: 第二調整參數。
es相關主機磁盤緩存相關參數
vm.dirty_background_ratio
這個參數指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將一定緩存的髒頁異步地刷入外存;
vm.dirty_ratio
該參數則指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存髒頁(因爲此時髒頁數量已經比較多,爲了避免數據丟失需要將一定髒頁刷入外存);在此過程中很多應用進程可能會因爲系統轉而處理文件IO而阻塞。
把該參數適當調小,原理通(1)類似。如果cached的髒數據所佔比例(這裏是佔MemTotal的比例)超過這個設置,系統會停止所有的應用層的IO寫操作,等待刷完數據後恢復IO。所以萬一觸發了系統的這個操作,對於用戶來說影響非常大的。
sysctl -w vm.dirty_ratio=10
sysctl -w vm.dirty_background_ratio=5