linux 2.6的IO排程演算法

myownstars發表於2013-03-27
IO子系統架構
呼叫流程大致如下:
使用者程式write()--&gt 檔案系統層(page cache/bio)--pdflush--&gt block層(IO排程器/IO請求佇列) --&gt 裝置驅動(SCSI) --&gt 磁碟
當程式執行write操作時,先寫入page cache,由檔案系統層負責將連續的塊組成bio,並將其傳送給block層;
bio是連線檔案系統層和block層的介面;
linux 2.6提供4種IO排程演算法:

NOOP--全稱No Operation
採用FIFO,在此基礎上還實現了相鄰IO請求合併;
該演算法假定IO請求到達之前已經由驅動裝置做了最佳化,因此無需在做額外工作;
最簡便的演算法實現,適用於SSD和fusion IO

CFQ--全稱completely fair queuing,2.6.18成為預設選項;
為每個程式維護一個佇列,按照IO請求的地址排序(而非FIFO),輪詢處理,每次處理4個請求;
可以節省大量的磁碟尋道時間,對於傳統的磁碟比較有益,但有可能會出現餓死的情況;
很適合OLTP DB應用;

Deadline scheduler--
在CFQ的基礎上,解決了飢餓等待的問題;
除了程式IO,引入了讀IO和寫IO(FIFO),其中讀IO最大等待時間500ms,寫IO為5s,其優先順序均高於CFQ,
FIFO(read) > FIFO(write) > CFQ
比較適用於隨機IO請求

anticipatory scheduler
本質與deadline一致,但在每次讀操作後需等待6ms,如果期間收到相鄰位置的讀請求則立即滿足,對以隨機IO請求為主的環境可能會造成比較大的延時;
其目的是為了照顧順序IO

檢視當前的IO排程演算法
dmesg | grep -i scheduler
每個磁碟可使用不同的演算法
cat /sys/block/sda/queue/scheduler 
echo "cfq" > /sys/block/sda/queue/scheduler 

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

相關文章