傳統磁盤I/O調度算法

  目前來講,傳統的磁盤仍然是主流的存儲設備,從傳統的硬盤上讀取數據分爲如下3個步驟。算法

  1. 將磁頭移動到磁盤表面的正確位置,花費的時間叫尋道時間。
  2. 等待磁盤旋轉,須要的數據會移動到磁頭下面,花費的時間取決於磁盤的轉速,轉速越高的磁盤須要的時間越短。
  3. 磁盤繼續旋轉,直到全部須要的數據都通過磁頭。

  磁盤在作這樣動做的時候的快慢能夠歸結爲兩個因素:訪問時間(步驟1和2)和傳輸速度,這兩個因素也叫延遲和吞吐量。數據庫

 

 

 

 

 

  I/O請求處理的快慢有很大程度上取決於磁盤的尋道時間。爲了減小尋道時間,操做系統不對每次I/O請求都直接尋道處理,服務器

而是將I/O請求放入隊列,對請求進行合併和排序,來減小磁盤尋道操做次數。性能

  I/O 請求合併是指將兩個或者多個 I/O 請求合併成一個新請求,例如當新來的請求和當前請求隊列中的某個請求須要訪問的優化

是相同或者相鄰扇區時,那麼就能夠把兩個請求合併爲對同一個或者多個相鄰扇區的請求,這樣只須要一次尋道就足夠。經過ui

合併,多個 I/O 請求被壓縮爲一次 I/O,最後只須要一次尋址就能夠完成屢次尋址的效果。操作系統

  對於相鄰扇區的訪問經過合併處理,對於非相鄰扇區的訪問則經過排序處理。機械臂的轉動是朝着扇區增加方向的,若是把blog

I/O請求按照扇區增加排序,一次旋轉就能夠訪問更多的扇區,可以縮短全部請求的實際尋道時間。排序

  爲此Linux實現了 4種 I/O調度算法。分別是:隊列

  NOOP算法(No Operation)

  不對 I/O請求排序,除了合併請求也不會進行其餘任何優化,用最簡單的先進先出FIFO隊列順序提交I/O請求。NOOP算法

面向的主要是隨機訪問設備,例如SSD等。NOOP算法更適合隨機訪問設備的緣由主要是:隨機訪問設備不存在傳統機械磁盤的機

械臂移動(也就是磁頭移動)形成的尋道時間,那麼就沒有必要作多餘的事情。

  最後期限算法(Deadline):

  除了維護了一個擁有合併和排序功能的請求隊列以外,額外維護了兩個隊列,分別是讀請求隊列和寫請求隊列,它們都是帶有超

時的FIFO隊列。當新來一個I/O請求時,會被同時插入普通隊列和讀/寫隊列,而後I/O調度器正常處理普通隊列中的請求。當調度器發

現讀/寫請求隊列中的請求超時的時候,會優先處理這些請求,保證儘量不產生飢餓請求。Deadline在全局吞吐量和延遲方面作了權

衡,犧牲必定的全局吞吐量來避免出現飢餓請求的可能。當系統存在大量順序請求的時候,Deadline可能致使請求沒法被很好的排序,

引起頻繁尋道。

  預期算法(Anticipatory):

  是基於預測的I/O算法,它和Deadline很相似,也維護了三個請求隊列,區別在於,Anticipatory處理完一個I/O請求以後並不會直接

返回處理下一個請求,而是等待片刻(默認 6ms),等待期間若是有新來的相鄰扇區的請求,會直接處理新來的請求,當等待時間結束

後,調度才返回處理下一個隊列請求。Anticipatory適合寫入較多的環境,例如文件服務器等,不適合MySQL等隨機讀取較多的數據庫

環境。

  徹底公平隊列(Complete Fair Queuing/CFQ):

  把 I/O請求按照進程分別放入進程對應的隊列中。CFQ的公平是針對進程而言的,每個提交I/O請求的進程都會有本身的I/O隊列,

CFQ以時間片算法爲前提,輪轉調動隊列,默認從當前隊列中取出4個請求處理,而後處理下一個隊列的4個請求,確保每一個進程享有的

I/O資源是均衡的。

  從上面的算法中能夠看到,在不一樣的場景下選擇不一樣的 I/O 調度器是十分必要的。在徹底隨機的訪問環境下,CFQ和Deadline性能

差別很小,可是在有大的連續I/O出現的狀況下,CFQ可能會形成小I/O的響應延時增長,因此建議MySQL數據庫環境設置爲Deadline算

法,這樣更穩定。對於 SSD 等設備,採用 NOOP或者Deadline 一般也能夠獲取比默認調度器更好的性能。

相關文章
相關標籤/搜索