記一次服務器IO太高處理過程

記一次服務器IO太高處理過程緩存

 

 

1、背景

    在一次上線升級後,發現兩臺tomcat服務器的IOwait一直超過100ms,高峯時甚至超過300ms,檢查服務器發現CPU負載,內存的使用率都不高。問題可能出如今硬盤讀寫,並且那塊硬盤除了寫日誌外,沒有其餘的IO操做。最後發現是應用打印的日誌信息太多,致使磁盤IO負載太高。tomcat

 

 

2、尋求解決過程

經過查找資料發現,Linux是用pdflush進程把數據從緩存頁寫入硬盤的,那麼經過修改pdflush的一些參數應該能夠改善IO負載問題。bash

 

pdflush的行爲受/proc/sys/vm中的參數的控制服務器

pdflush寫入硬盤看兩個參數:app

1 數據在頁緩存中是否超出30秒,若是是,標記爲髒頁緩存,寫入磁盤;ide

2 髒頁緩存是否達到工做內存的10%;性能

 

pdflush的第一件事是讀取spa

/proc/sys/vm/dirty_expire_centiseconds(default 3000)

聲明Linux內核寫緩衝區裏面的數據多「舊」了以後,pdflush進程就開始考慮寫到磁盤中去。單位是 1/100秒。缺省是 30000,也就是 30 秒的數據就算舊了,將會刷新磁盤。對於特別重載的寫操做來講,這個值適當縮小也是好的,但也不能縮小太多,由於縮小太多也會致使IO提升太快。日誌

固然,若是你的系統內存比較大,而且寫入模式是間歇式的,而且每次寫入的數據不大(好比幾十M),那麼這個值仍是大些的好。進程

 

 

第二件事是判斷內存是否到了要寫入硬盤的限額,由參數決定:

/proc/sys/vm/dirty_ratio (default 20)

控制文件系統的寫緩衝區的大小,單位是百分比,表示佔系統內存的百分比,表示當寫緩衝使用到系統內存多少的時候,開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩衝,也能夠極大提升系統的寫性能。可是,當你須要持續、恆定的寫入場合時,應該下降其數值。


/proc/sys/vm/dirty_background_ratio(default 10)

控制文件系統的pdflush進程,在什麼時候刷新磁盤。單位是百分比,表示系統內存的百分比,保留過時頁緩存(髒頁緩存)的最大值。是以MmeFree+Cached-Mapped的值爲基準的,當超過最大值則緩存頁寫入磁盤。pdflush用於將內存中的內容和文件系統進行同步,好比說,當一個文件在內存中進行修改,pdflush負責將它寫回硬盤。每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤。增大之會使用更多系統內存用於磁盤寫緩衝,也能夠極大提升系統的寫性能。可是,當你須要持續、恆定的寫入場合時,應該下降其數值:


/proc/sys/vm/dirty_writeback_centisecs(default 500)

控制內核的髒數據刷新進程pdflush的運行間隔。單位是 1/100 秒。缺省數值是500,也就是 5 秒。若是你的系統是持續地寫入動做,那麼實際上仍是下降這個數值比較好,這樣能夠把尖峯的寫操做削平成屢次寫操做。

 

對於有高度寫入操做的系統

dirty_background_ratio:         主要調整參數。若是須要把緩存持續的而不是一會兒大量的寫入硬盤,下降這個值。

dirty_ratio    第二調整參數。

 

若是有大量的寫操做,爲避免I/O的長時間等待,能夠設置:

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

 

 

另外文件系統數據緩衝須要頻繁的內存分配。加大保留內存的值能提高系統速度和穩定。小於8G的內存,保留內存爲64M,大於8G的設置爲256M

$ echo 65536 >/proc/sys/vm/min_free_kbytes



3、最終解決方案

修改後效果明顯的參數:/proc/sys/vm/dirty_expire_centiseconds (default 3000)

 

默認是30秒,時間有點長,我把它改爲10

echo 1000 >/proc/sys/vm/dirty_expire_centisecs

 

修改完後,IOwait時間立馬降低,平均40ms~50ms,是原來的1/3~1/4

困擾已久的IO問題得以解決!

 

如下是個人修改參數完整列表:

echo 5 > /proc/sys/vm/dirty_ratio
echo 2 >/proc/sys/vm/dirty_background_ratio
echo 100 >/proc/sys/vm/dirty_writeback_centisecs
echo 262144 >/proc/sys/vm/min_free_kbytes
echo 1000 >/proc/sys/vm/dirty_expire_centisecs
相關文章
相關標籤/搜索