2019年8月19日 星期一

linux I/O優化設定參數!

查看關於 buffers cache 緩存的信息
cat /proc/meminfo  or free -wh

其中的Cached指用於pagecache的內存大小(diskcache-SwapCache)。
隨著寫入緩存頁,Dirty的值會增加。
一旦開始把緩存頁寫入硬盤,Writeback的值會增加直到寫入結束。

Linux用pdflush進程把數據從緩存頁寫入硬盤,查看有多少個pdflush進程
cat /proc/sys/vm/nr_pdflush_threads

pdflush的行為受/proc/sys/vm中的參數的控制
/proc/sys/vm/ dirty_writeback_centisecs (default 500 (0.01秒)): 
多長時間喚醒pdflush將緩存頁數據寫入硬盤。默認5秒喚醒2個(更多個)線程。
如果wrteback的時間長於dirty_writeback_centisecs的時間,可能會出問題。

pdflush的第一件事是讀取
/proc/sys/vm/dirty_expire_centiseconds (default 3000 (0.01秒))
緩存頁里數據的過期時間(舊數據),在下一個週期內被寫入硬盤。默認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:第二調整參數。

Swapping參數
/proc/sys/vm/swappiness
默認,linux傾向於從物理內存映射到硬盤緩存,保持硬盤緩存盡可能大。未用的頁緩存會被放進swap區。
數值為0,將會避免使用swapping
100,將會盡量使用swapping
少用swapping會增加程序的響應速度;多用swapping將會提高系統的可用性。

如果有大量的寫操作,為避免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


I/O調度器
cat /sys/block/[disk]/queue/scheduler 

調度算法
** noop deadline [cfq] 
    deadline: deadline算法保證對既定的IO請求以最小的延遲時間。
    cfq: 對每個進程維護一個IO隊列,各個進程發來的IO請求會被cfq以輪循方式處理,對每一個IO請求都是公平。適合離散讀的應用。
    noop: 對所有IO請求都用FIFO隊列形式處理。默認IO不會存在性能問題。

改變調度器
$ echo deadline > /sys/block/sdX/queue/scheduler
對於數據庫服務器,deadline算法是推薦的。

提高調度器請求隊列的
$ echo 4096 > /sys/block/sdX/queue/nr_requests

有大量的讀請求,默認的請求隊列應付不過來,可以提高這個值。缺點是要犧牲一定的內存。
為了增加連續讀取的吞吐量,可以增加預讀數據量。預讀的實際值是自適應的,所以使用一個較高的值,不會降低小型隨機存取的性能。
$ echo 4096 > /sys/block/sdX/queue/read_ahead_kb
如果LINUX判斷一個進程在順序讀取文件,那麼它會提前讀取進程所需文件的數據,放在緩存中。
 

服務器遇到磁盤寫活動高峰,導致請求處理延遲非常大(超過3秒)。
通過調整內核參數,將寫活動的高峰分佈成頻繁的多次寫,每次寫入的數據比較少。這樣可以把尖峰的寫操作削平成多次寫操作。
以這種方式執行的效率比較低,因為內核不太有機會組合寫操作。但對於繁忙的服務器,寫操作將更一致地進行,並將極大地改進交互式性能。
/proc/sys/vm/dirty_ratio
控製文件系統的寫緩衝區的大小,單位是百分比,表示佔系統內存的百分比,表示當寫緩衝使用到系統內存多少的時候,開始向磁盤寫出數據。
增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值。

/proc/sys/vm/dirty_background_ratio
控製文件系統的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統內存的百分比,pdflush用於將內存中的內容和文件系統進行同步,
比如說,當一個文件在內存中進行修改,pdflush負責將它寫回硬盤.每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤.
增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值:

/proc/sys/vm/dirty_writeback_centisecs
控制內核的髒數據刷新進程pdflush的運行間隔。單位是1/100秒。缺省數值是500,也就是5秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,
這樣可以把尖峰的寫操作削平成多次寫操作。
如果你的系統是短期地尖峰式的寫操作,並且寫入數據不大(幾十M/次)且內存有比較多富裕,那麼應該增大此數值。
該參數的設置應該小於dirty_expire_centisecs,但也不能太小,太小I/O太頻繁,反而
使系統性能下降。具體可能需要在生產環境上測試。據說1:6 (dirty_expire_centisecs : dirty_writeback_centisecs )的比例比較好。

/proc/sys/vm/dirty_expire_centisecs
聲明Linux內核寫緩衝區裡面的數據多“舊”了之後,pdflush進程就開始考慮寫到磁盤中去。單位是1/100秒。缺省是30000,也就是30秒的數據就算舊了,
將會刷新磁盤。對於特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。
當然,如果你的系統內存比較大,並且寫入模式是間歇式的,並且每次寫入的數據不大(比如幾十M),那麼這個值還是大些的好。

/proc/sys/vm/vfs_cache_pressure
表示內核回收用於directory和inode cache內存的傾向;缺省值100表示內核將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;
降低該值低於100,將導致內核傾向於保留directory和inode cache;增加該值超過100,將導致內核傾向於回收directory和inode cache

/proc/sys/vm/min_free_kbytes
表示強制Linux VM最低保留多少空閒內存(Kbytes)。
缺省設置:724(512M物理內存)

/proc/sys/vm/nr_pdflush_threads
表示當前正在運行的pdflush進程數量,在I/O負載高的情況下,內核會自動增加更多的pdflush進程。

/proc/sys/vm/overcommit_memory
指定了內核針對內存分配的策略,其值可以是0、1、2。
0,表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1,表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2,表示內核允許分配超過所有物理內存和交換空間總和的內存(參照overcommit_ratio)。
缺省設置:0

/proc/sys/vm/overcommit_ratio
如果overcommit_memory=2,可以過載內存的百分比,通過以下公式來計算系統整體可用內存。系統可分配內存=交換空間+物理內存*overcommit_ratio/100
缺省設置:50(%)

/proc/sys/vm/page - cluster
表示在寫一次到swap區的時候寫入的頁面數量,0表示1頁,1表示2頁,2表示4頁。
缺省設置:3(2的3次方,8頁)

/proc/sys/vm/swapiness
表示系統進行交換行為的程度,數值(0-100)越高,越可能發生磁盤交換。

想要開機後長置更改:
vi  /etc/sysctl.conf
add "vm.dirty_ratio = 40"

沒有留言:

張貼留言