歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下io磁盤調度策略

Linux下io磁盤調度策略

日期:2017/2/28 16:12:32   编辑:Linux教程

I/O 調度算法再各個進程競爭磁盤I/O的時候擔當了裁判的角色。他要求請求的次序和時機做最優化的處理,以求得盡可能最好的整體I/O性能。
在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 disk和TCQ disk等)。現代磁盤控制器都具備通過tagged command queuing進行優化的功能。Tagged command queuing(TCQ)可以通過由磁盤控制器對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
cat /sys/block/{DEVICE-NAME}/queue/scheduler
cat /sys/block/sd*/queue/scheduler
例:輸出結果如下
noop anticipatory deadline [cfq]
設置當前IO
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 調度調節的內核參數
/proc/sys/vm/dirty_ratio
這個參數控制文件系統的文件系統寫緩沖區的大小,單位是百分比,表示系統內存的百分比,表示當寫緩沖使用到系統內存多少的時候,開始向磁盤寫出數 據。增大之會使用更多系統內存用於磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上缺省是 10。下面是增大的方法: echo ’40′> /proc/sys/vm/dirty_ratio

/proc/sys/vm/dirty_background_ratio
這個參數控制文件系統的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統內存的百分比,意思是當寫緩沖使用到系統內存多少的時候, pdflush開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上缺省是 5。下面是增大的方法: echo ’20′ > /proc/sys/vm/dirty_background_ratio

/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

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

Copyright © Linux教程網 All Rights Reserved