linux 系統IO 排程

babyyellow發表於2012-12-14
I/O 排程演算法再各個程式競爭磁碟I/O的時候擔當了裁判的角色.他要求請求的次序和時機做最最佳化的處理,以求得儘可能最好的整體I/O效能.其實所有的 IO 最佳化只有二點,合併和排序…

在linux下面列出4種排程演算法

CFQ (Completely Fair Queuing 完全公平的排隊)(elevator=cfq):

這是預設演算法,對於通用伺服器來說通常是最好的選擇.它試圖均勻地分佈對I/O頻寬的訪問.在多媒體應用, 總能保證audio、video及時從磁碟讀取資料.但對於其他各類應用表現也很好.每個程式一個queue,每個queue按照上述規則進行merge 和sort.程式之間round robin排程,每次執行一個程式的4個請求.可以調 queued 和 quantum 來最佳化

Deadline (elevator=deadline):

這個演算法試圖把每次請求的延遲降至最低.該演算法重排了請求的順序來提高效能.可以調佇列的過期的讀寫過程,如 read_expire 和 write_expire 二個引數來控制多久內一定要讀到資料,超時就放棄排序.比較合適小檔案.還可以使用開啟 front_merges 來進行合併鄰近檔案.

NOOP (elevator=noop):

    I/O請求被分配到佇列,排程由硬體進行,只有當CPU時脈頻率比較有限時進行.
Noop對於I/O不那麼操心,對所有的I/O請求都用FIFO佇列形式處理,預設認為 I/O不會存在效能問題.這也使得CPU也不用那麼操心.當然對於複雜一點的應用型別使用這個排程器,使用者自己就會非常操心.
Noop排程演算法指的是當請求被儲存到佇列並交由I/O子系統處理時由磁碟硬體對其進行最佳化.該演算法一般只對一些特定的硬體(例如RAM diskTCQ disk等).現代磁碟控制器都具備透過tagged command queuing進行最佳化的功能.Tagged command queuingTCQ)可以透過由磁碟控制器對I/O請求進行重新排序來減少磁頭的動作.通常需要進行重組的I/O請求都會帶有一個識別符號,這樣控制器在接收到這些I/O請求的時候會按照規則進行處理.
有些應用程式需要對佇列長度進行限制,而現代的裝置驅動都具備用於控制佇列長度的TCO功能,並且該功能可以作為核心引數在系統啟動的時候新增.例如要控制SCSI驅動器Lun2的佇列長度為64個請求,可以修改/etc/grub.conf並增加下面的核心引數:aic7xxx=tag_info:{{0,0,64,0,0,0,0}}

Anticipatory (elevator=as):

   對讀操作最佳化服務時間,在提供一個I/O的時候進行短時間等待,使程式能夠提交到另外 的I/O.Anticipatory scheduler(as) 曾經一度是Linux 2.6 Kernel的I/O scheduler.Anticipatory的中文含義是“預料的,預想的”,這個詞的確揭示了這個演算法的特點,簡單的說有個I/O發生的時候,如果又 有程式請求I/O操作,則將產生一個預設的6毫秒猜測時間,猜測下一個程式請求I/O是要幹什麼的.這對於隨機讀取會造成比較大的延時,對資料庫應用很糟 糕,而對於Web Server等則會表現的不錯.這個演算法也可以簡單理解為面向低速磁碟的,因為那個“猜測”實際上的目的是為了減少磁頭移動時間.因此這種演算法更加適合順 序讀寫的應用程式.這個可以用來調整的核心引數有 antic_expire ,read_expire 和 write_expire.

 

linux中IO排程方法的檢視和設定的方法

檢視當前IO
1
2
$ cat /sys/block/{DEVICE-NAME}/queue/scheduler
$ cat /sys/block/sd*/queue/scheduler
例:輸出結果如下
1
noop anticipatory deadline [cfq]
設定當前IO
1
2
$ echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
$ echo noop > /sys/block/hda/queue/scheduler

對IO排程使用的建議

Deadline I/O scheduler 
       在這個中 deadline 排程演算法透過降低效能而獲得更短的等待時間,它使用輪詢的排程器,簡潔小巧,提供了最小的讀取延遲和尚佳的吞吐量,特別適合於讀取較多的環境(比如資料庫,Oracle 10G 之類).
 
Anticipatory I/O scheduler
      anticipatory 演算法透過增加等待時間來獲得更高的效能,假設一個塊裝置只有一個物理查詢磁頭(例如一個單獨的SATA硬碟),將多個隨機的小寫入流合併成一個大寫入流 (相當於給隨機讀寫變順序讀寫), 使用這個原理來使用讀取寫入的延時換取最大的讀取寫入吞吐量.適用於大多數環境,特別是讀取寫入較多的環境,比如檔案伺服器,Web 應用,App等應用我們可以採納as排程.後面我會教大家怎麼調這個的合併的等待時間.
 
CFQ I/O scheduler
      這個是 對所有因素也都做了折中而儘量獲得公平性,使用QoS策略為所有任務分配等量的頻寬,避免程式被餓死並實現了較低的延遲,可以認為是上述兩種排程器的折中.適用於有大量程式的多使用者系統
 
Anticipatory 調節
 
根據上面的內容,我們演算法中可能用的最多的就是 Anticipatory 的演算法了,會根據時間來多排一些內容在寫,所以下面講講這個引數可以調的部分.
除了演算法修改成這個演算法外,影響它的還有

磁碟佇列長度
/sys/block/sda/queue/nr_requests 預設只有 128 個佇列,可以提高到 512 個.會更加佔用記憶體,但能更加多的合併讀寫操作,速度變慢,但能讀寫更加多的量

等待時間
/sys/block/sda/queue/iosched/antic_expire 讀取附近產生的新請時等待多長時間

對讀最佳化的引數

/sys/block/sda/queue/read_ahead_kb
    這個引數對順序讀非常有用,意思是,一次提前讀多少內容,無論實際需要多少.預設一次讀 128kb 遠小於要讀的,設定大些對讀大檔案非常有用,可以有效的減少讀 seek 的次數,這個引數可以使用 blockdev –setra 來設定,setra 設定的是多少個扇區,所以實際的位元組是除以2,比如設定 512 ,實際是讀 256 個位元組.

幾個非常有效的 IO 排程調節的核心引數

 

1
/proc/sys/vm/dirty_ratio

  這個引數控制檔案系統的檔案系統寫緩衝區的大小,單位是百分比,表示系統記憶體的百分比,表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出數 據.增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能.但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上預設是 10.下面是增大的方法: echo ’40′> /proc/sys/vm/dirty_ratio

 

 

1
/proc/sys/vm/dirty_background_ratio

  這個引數控制檔案系統的pdflush程式,在何時重新整理磁碟.單位是百分比,表示系統記憶體的百分比,意思是當寫緩衝使用到系統記憶體多少的時候, pdflush開始向磁碟寫出資料.增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能.但是,當你需要持續、恆定的寫入場合時,應該 降低其數值,一般啟動上預設是 5.下面是增大的方法: echo ’20′ > /proc/sys/vm/dirty_background_ratio

 

1
/proc/sys/vm/dirty_writeback_centisecs

    這個引數控制核心的髒資料重新整理程式pdflush的執行間隔.單位是 1/100 秒.預設數值是500,也就是 5 秒.如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作.設定方法如下: echo ’200′ > /proc/sys/vm/dirty_writeback_centisecs 如果你的系統是短期地尖峰式的寫操作,並且寫入資料不大(幾十M/次)且記憶體有比較多富裕,那麼應該增大此數值: echo ’1000′ > /proc/sys/vm/dirty_writeback_centisecs

1
/proc/sys/vm/dirty_expire_centisecs

  這個引數宣告Linux核心寫緩衝區裡面的資料多“舊”了之後,pdflush程式就開始考慮寫到磁碟中去.單位是 1/100秒.預設是 30000,也就是 30 秒的資料就算舊了,將會重新整理磁碟.對於特別過載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快.建議設定為 1500,也就是15秒算舊. echo ’1500′ > /proc/sys/vm/dirty_expire_centisecs 當然,如果你的系統記憶體比較大,並且寫入模式是間歇式的,並且每次寫入的資料不大(比如幾十M),那麼這個值還是大些的好.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-751108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章