聲明,本文章內容大量拷貝自原文:http://liwei.life/2016/03/14/linux_io_scheduler/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io,本文章只是對該文章的部分內容的摘選,如果您想更深入仔細的了解IO調度算法,推薦您直接閱讀原文:)
之前蘑菇街電話面試的時候面試官問我IO調度算法有哪些,之前沒留意過這個東西,記錄一下:)
對於普通的機械硬盤,我們完成一次IO讀寫的流程從硬盤的物理結構上來說是,機械硬盤的存儲介質是磁盤,磁頭在盤片上移動進行磁道尋址,行為類似播放一張唱片。這種結構的特點是,順序訪問時吞吐量較高,但是如果一旦對盤片有隨機訪問,那么大量的時間都會浪費在磁頭的移動上,這時候就會導致每次IO的響應時間變長,極大的降低IO的響應速度。磁頭在盤片上尋道的操作,類似電梯調度,如果在尋道的過程中,能把順序路過的相關磁道的數據請求都“順便”處理掉,那么就可以在比較小影響響應速度的前提下,提高整體IO的吞吐量。這就是我們問什么要設計IO調度算法的原因。
常見的算法總結:
CFQ完全公平隊列(Completely Fair Queueing)
cfq就是試圖給所有進程分配等同的塊設備使用的時間片,進程在時間片內,可以將產生的IO請求提交給塊設備進行處理,時間片結束,進程的請求將排進它自己的隊列,等待下次調度的時候進行處理。這就是cfq的基本原理。
DeadLine最終期限調度
deadline調度算法相對cfq要簡單很多。其設計目標是,在保證請求按照設備扇區的順序進行訪問的同時,兼顧其它請求不被餓死,要在一個最終期限前被調度到。我們知道磁頭對磁盤的尋道是可以進行順序訪問和隨機訪問的,因為尋道延時時間的關系,順序訪問時IO的吞吐量更大,隨機訪問的吞吐量小。如果我們想為一個機械硬盤進行吞吐量優化的話,那么就可以讓調度器按照盡量復合順序訪問的IO請求進行排序,之后請求以這樣的順序發送給硬盤,就可以使IO的吞吐量更大。但是這樣做也有另一個問題,就是如果此時出現了一個請求,它要訪問的磁道離目前磁頭所在磁道很遠,應用的請求又大量集中在目前磁道附近。導致大量請求一直會被合並和插隊處理,而那個要訪問比較遠磁道的請求將因為一直不能被調度而餓死。deadline就是這樣一種調度器,能在保證IO最大吞吐量的情況下,盡量使遠端請求在一個期限內被調度而不被餓死的調度器。
Noop調度器
noop調度器是最簡單的調度器。它本質上就是一個鏈表實現的fifo隊列,並對請求進行簡單的合並處理。調度器本身並沒有提供任何可疑配置的參數。
各種調度器的應用場景選擇
從原理上看,
cfq是一種比較通用的調度算法,它是一種以進程為出發點考慮的調度算法,保證大家盡量公平,為所有進程分配等量的帶寬,適合於桌面多任務及多媒體應用。
deadline是一種以提高機械硬盤吞吐量為思考出發點的調度算法,盡量保證在有io請求達到最終期限的時候進行調度,非常適合業務比較單一並且IO壓力比較重的業務,比如數據庫。
而noop呢?其實如果我們把我們的思考對象拓展到固態硬盤,那么你就會發現,無論cfq還是deadline,都是針對機械硬盤的結構進行的隊列算法調整,而這種調整對於固態硬盤來說,完全沒有意義。對於固態硬盤來說,IO調度算法越復雜,額外要處理的邏輯就越多,效率就越低。所以,固態硬盤這種場景下使用noop是最好的,deadline次之,而cfq由於復雜度的原因,無疑效率最低。
如何(查看&&修改)我們OS上的IO調度算法?
查看當前系統支持的IO調度算法
[root@VM_58_172_centos ~]# dmesg | grep -i scheduler [ 0.580914] io scheduler noop registered [ 0.582382] io scheduler deadline registered (default) [ 0.584125] io scheduler cfq registered
查看某塊硬盤的IO調度算法
[root@VM_58_172_centos ~]# cat /sys/block/vda/queue/scheduler none [root@VM_58_172_centos ~]# cat /sys/block/vdb/queue/scheduler none
修改某塊硬盤的IO調度算法
[root@VM_58_172_centos ~]# echo cfq > /sys/block/vda/queue/scheduler [root@VM_58_172_centos ~]# cat /sys/block/vda/queue/scheduler none
我是在虛擬雲主機上做的實驗,不知為什么無法修改對應硬盤的IO調度算法,或許是供應商對此做了限制?之后再去細查一下。
參考:
Linux的IO調度(分析的很深入,嚴重推薦~):http://liwei.life/2016/03/14/linux_io_scheduler/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io