標籤:io os 使用 strong 檔案 資料 div 問題 sp
對於LINUX SA來說,伺服器效能是需要我們特別關注的,包括CPU、IO、記憶體等等系統的最佳化變得至關重要,這裡轉載一篇非常不錯的關於IO最佳化的文章,供大家參考和學習:一、關於頁面緩衝的資訊,可以用cat /proc/meminfo
看到。其中的Cached 指用於pagecache的記憶體大小(diskcache-SwapCache)。隨著寫入快取頁面,Dirty 的值會增加。
一旦開始把快取頁面寫入硬碟,Writeback的值會增加直到寫入結束。 Linux 用pdflush進程把資料從快取頁面寫入硬碟,查看有多少個pdflush進程
cat /proc/sys/vm/nr_pdflush_threadspdflush的行為受/proc/sys/vm中的參數的控制
/proc/sys/vm/dirty_writeback_centisecs (default 500):
1/100秒, 多長時間喚醒pdflush將快取頁面資料寫入硬碟。預設5秒喚醒2個(更多個)線程。
如果wrteback的時間長於dirty_writeback_centisecs的時間,可能會出問題。
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: 第二調整參數。
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
4中調度演算法
noop anticipatory deadline [cfq]
deadline : deadline 演算法保證對既定的IO請求以最小的延遲時間。
anticipatory: 有個IO發生後,如果又有進程請求IO,則產生一個預設6ms猜測時間,猜測下一個進程請求IO是幹什麼。這對於隨機讀取會造成較大的延時。
對資料庫應用很糟糕,而對於Web Server等則會表現不錯。
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秒)。通過調整核心參數,將寫活動的高峰分布成頻繁的多次寫,每次寫入的資料比較少。這樣可以把尖峰的寫操作削平成多次寫操作。以這種方式執行的效率比較低,因為核心不太有機會組合寫操作。但對於繁忙的伺服器,寫操作將更一致地進行,並將極大地改進互動式效能。
<strong>/proc/sys/vm/dirty_ratio </strong>
控制檔案系統的寫緩衝區的大小,單位是百分比,表示占系統記憶體的百分比,表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出資料。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恒定的寫入場合時,應該降低其數值。
<strong>/proc/sys/vm/dirty_background_ratio</strong>
控制檔案系統的pdflush進程,在何時重新整理磁碟。單位是百分比,表示系統記憶體的百分比,pdflush用於將記憶體中的內容和檔案系統進行同步,比如說,當一個檔案在記憶體中進行修改,pdflush負責將它寫回硬碟.每當記憶體中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬碟.增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恒定的寫入場合時,應該降低其數值:
<strong>/proc/sys/vm/dirty_writeback_centisecs</strong>
控制核心的髒資料重新整理進程pdflush的運行間隔。單位是 1/100 秒。預設數值是500,也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。
如果你的系統是短期地尖峰式的寫操作,並且寫入資料不大(幾十M/次)且記憶體有比較多富裕,那麼應該增大此數值。
該參數的設定應該小於dirty_expire_centisecs,但也不能太小,太小I/O太頻繁,反而
使系統效能下降。具體可能需要在生產環境上測試。據說1:6 (dirty_expire_centisecs : dirty_writeback_centisecs )的比例比較好。
<strong>/proc/sys/vm/dirty_expire_centisecs</strong>
聲明Linux核心寫緩衝區裡面的資料多“舊”了之後,pdflush進程就開始考慮寫到磁碟中去。單位是 1/100秒。預設是 30000,也就是 30 秒的資料就算舊了,將會重新整理磁碟。對於特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。
當然,如果你的系統記憶體比較大,並且寫入模式是間歇式的,並且每次寫入的資料不大(比如幾十M),那麼這個值還是大些的好。
<strong>/proc/sys/vm/vfs_cache_pressure</strong>
表示核心回收用於directory和inode cache記憶體的傾向;預設值100表示核心將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;降低該值低於100,將導致核心傾向於保留directory和inode cache;增加該值超過100,將導致核心傾向於回收directory和inode cache
<strong>/proc/sys/vm/min_free_kbytes</strong>
表示強制Linux VM最低保留多少空閑記憶體(Kbytes)。
預設設定:724(512M實體記憶體)
<strong>/proc/sys/vm/nr_pdflush_threads</strong>
表示當前正在啟動並執行pdflush進程數量,在I/O負載高的情況下,核心會自動增加更多的pdflush進程。
<strong>/proc/sys/vm/overcommit_memory</strong>
指定了核心針對記憶體配置的策略,其值可以是0、1、2。
0, 表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。
1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體(參照overcommit_ratio)。
預設設定:0
<strong>/proc/sys/vm/overcommit_ratio</strong>
如果overcommit_memory=2,可以過載記憶體的百分比,通過以下公式來計算系統整體可用記憶體。系統可分配記憶體=交換空間+實體記憶體*overcommit_ratio/100
預設設定:50(%)
<strong>/proc/sys/vm/page-cluster</strong>
表示在寫一次到swap區的時候寫入的頁面數量,0表示1頁,1表示2頁,2表示4頁。
預設設定:3(2的3次方,8頁)
<strong>/proc/sys/vm/swapiness</strong>
表示系統進行交換行為的程度,數值(0-100)越高,越可能發生磁碟交換。
更改:
/etc/sysctl.conf
<strong>vm.dirty_ratio = 40</strong>
sysctl -p
查看:
<strong>find /proc/sys/vm -name dirty* -print | while read name; do echo $name ;cat ${<strong>name</strong> </strong>
Linux 檔案系統IO效能最佳化