linux 2.6內核的四種IO調度算法

雖說內核2.6版本比較舊了,最新debian8已經用3.16,但許多企業伺服器還在用2.6,且不能內核升級。
廢話少說,看下文:
在LINUX 2.6中,有四種關于IO的調度算法,下面綜合小結一下:
1) NOOP
NOOP算法的全寫爲No Operation。該算法實現了最最簡單的FIFO隊列,所有IO請求大致按照先來後到的順序進行操作。之所以說“大致”,原因是NOOP在FIFO的基礎上還做了相鄰IO請求的合並,並不是完完全全按照先進先出的規則滿足IO請求。NOOP假定I/O請求由驅動程序或者設備做了優化或者重排了順序(就像一個智能控制器完成的工作那樣)。在有些SAN環境下,這個選擇可能是最好選擇。Noop 對于 IO 不那麽操心,對所有的 IO請求都用 FIFO 隊列形式處理,默認認爲 IO 不會存在效能問題。這也使得 CPU 也不用那麽操心。當然,對于複雜一點的應用類型,使用這個調度器,用戶自己就會非常操心。
2) Deadline scheduler
  DEADLINE在CFQ的基礎上,解決了IO請求餓死的極端情況。除了CFQ本身具有的IO排序隊列之外,DEADLINE額外分別爲讀IO和寫IO提供了FIFO隊列。讀FIFO隊列的最大等待時間爲500ms,寫FIFO隊列的最大等待時間爲5s。FIFO隊列內的IO請求優先級要比CFQ隊列中的高,,而讀FIFO隊列的優先級又比寫FIFO隊列的優先級高。優先級可以表示如下:
FIFO(Read) > FIFO(Write) > CFQ
    deadline 算法保證對于既定的 IO 請求以最小的延遲時間,從這一點理解,對于 DSS 應用應該會是很適合的。
3) Anticipatory scheduler:預期調度
  CFQ和DEADLINE考慮的焦點在于滿足零散IO請求上。對于連續的IO請求,比如順序讀,並沒有做優化。爲了滿足隨機IO和順序IO混合的場景,Linux還支持ANTICIPATORY調度算法。ANTICIPATORY的在DEADLINE的基礎上,爲每個讀IO都設置了6ms
的等待時間窗口。如果在這6ms內OS收到了相鄰位置的讀IO請求,就可以立即滿足
   Anticipatory scheduler(as) 曾經一度是 Linux 2.6 Kernel 的 IO scheduler 。Anticipatory 的中文含義是”預料的, 預想的”, 這個詞的確揭示了這個算法的特點,簡單的說,有個 IO 發生的時候,如果又有進程請求 IO 操作,則將産生一個默認的 6 毫秒猜測時間,猜測下一個 進程請求 IO 是要幹什麽的。這對于隨即讀取會造成比較大的延時,對數據庫應用很糟糕,而對于 Web Server 等則會表現的不錯。這個算法也可以簡單理解爲面向低速磁盤的,因爲那個”猜測”實際上的目的是爲了減少磁頭移動時間。
4)CFQ:完全公平隊列
  CFQ算法的全寫爲Completely Fair Queuing。該算法的特點是按照IO請求的地址進行排序,而不是按照先來後到的順序來進行回應。
   在傳統的SAS盤上,磁盤尋道花去了絕大多數的IO回應時間。CFQ的出發點是對IO地址進行排序,以盡量少的磁盤旋轉次數來滿足盡可能多的IO請求。在CFQ算法下,SAS盤的吞吐量大大提高了。但是相比于NOOP的缺點是,先來的IO請求並不一定能被滿足,可能會出現餓死的情況。
   Completely Fair Queuing (cfq, 完全公平隊列) 在 2.6.18 取代了 Anticipatory scheduler 成爲 Linux Kernel 默認的 IO scheduler 。cfq 對每個進程維護一個 IO 隊列,各個進程發來的 IO 請求會被 cfq 以輪循方式處理。也就是對每一個 IO 請求都是公平的。這使得 cfq 很適合離散讀的應用(eg: OLTP DB)。我所知道的企業級 Linux 發行版中,SuSE Linux 好像是最先默認用 cfq 的.
查看和修改IO調度器的算法非常簡單。假設我們要對sda進行操作,如下所示:
cat /sys/block/sda/queue/scheduler
echo “cfq” > /sys/block/sda/queue/scheduler
總結:
  1 CFQ和DEADLINE考慮的焦點在于滿足零散IO請求上。對于連續的IO請求,比如順序讀,並沒有做優化。爲了滿足隨機IO和順序IO混合的場景,Linux還支持ANTICIPATORY調度算法。ANTICIPATORY的在DEADLINE的基礎上,爲每個讀IO都設置了6ms的等待時間窗口。如果在這6ms內OS收到了相鄰位置的讀IO請求,就可以立即滿足。
IO調度器算法的選擇,既取決于硬件特征,也取決于應用場景。
在傳統的SAS盤上,CFQ、DEADLINE、ANTICIPATORY都是不錯的選擇;對于專屬的數據庫伺服器,DEADLINE的吞吐量和回應時間都表現良好。然而在新興的固態硬盤比如SSD、Fusion IO上,最簡單的NOOP反而可能是最好的算法,因爲其他三個算法的優化是基于縮短尋道時間的,而固態硬盤沒有所謂的尋道時間且IO回應時間非常短。
  2 對于數據庫應用, Anticipatory Scheduler 的表現是最差的。Deadline 在 DSS 環境表現比 cfq 更好一點,而 cfq 綜合來看表現更好一些。這也難怪 RHEL 4 默認的 IO 調度器設置爲 cfq. 而 RHEL 4 比 RHEL 3,整體 IO 改進還是不小的。
更多相關文章
  • 在Linux 2.6中,有四種關于IO的調度算法,下面綜合小結一下: 1) NOOP NOOP算法的全寫爲No Operation.該算法實現了最最簡單的FIFO隊列,所有IO請求大致按照先來後到的順序進行操作.之所以說"大致",原因是NOOP在FIFO的基礎上還做了相鄰IO請求 ...
  • IO調度器(IO Scheduler)是操作系統用來決定塊設備上IO操作提交順序的方法.存在的目的有兩個,一是提高IO吞吐量,二是降低IO回應時間.然而IO吞吐量和IO回應時間往往是矛盾的,爲了盡量平衡這兩者,IO調度器提供了多種調度算法來適應不同的IO請求場景.其中,對數據庫這種隨機讀寫的場景最有 ...
  • 這是一篇學習筆記,主要是對<Linux 系統內核空間與用戶空間通信的實現與分析>中的源碼imp2的分析.其中的源碼,可以到以下URL下載:http://www-128.ibm.com/developerworks/cn/linux/l-netlink/imp2.tar.gz參考文檔< ...
  • 本文對內核的三個基本子系統進行了探討,並對它們在 Solaris 10.Linux 2.6 和 FreeBSD 5.3  中的實現進行了比較. 本文探討的三個子系統是調度.記憶體管理和文件系統體系結構.我之所以選擇這些子系統,是因爲它們是所有操作系統(不僅是 Unix 和類似于 Unix  的系統) ...
  • Linux內核中幾個比較有意思的解釋(進程調度算法,頁面調度算法,非線性工作集)
    1.O(1)調度器的時間計算公式與CFS調度器Linux 2.6.23之前普遍采用了O(1)調度器,它是一種基于優先級的時間片調度算法,所謂的O(1)只是它的一些精巧的數據結構使然,在不考慮動態補償/懲罰的情況下,只要優先級確定,那麽時間片就是固定的.2.6.23以後的CFS呢,它是一種基于權重的非 ...
  • @網路知識 Linux內核主要由五個部分組成:進程調度,記憶體管理,虛擬文件系統,網路接口,進程間通信. 稍微加以理解:CPU資源--記憶體資源--外存資源--外部資源--通信.   進程調度(SCHED):控制進程對CPU的訪問.當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程.可運行進 ...
  • [摘要] 由于Linux的獨特優勢,使越來越多的企業和科研機構把目光轉向Linux的開發和研究上.目前Linux最新的穩定內核版本爲2.6.17,但是當今絕大部分對于Linux Makefile的介紹文章都是基于2.4內核的,可以說關于2.6內核Makefile相關的文章鳳毛麟角,筆者抽時間完成了這 ...
  • CentOS Linux 升級內核步驟和方法 1.查看當前系統內核 # uname -r2.6.32-71.e16.i6862.下載linux-3.2.14內核包 # tar xvf linux-3.2.14.tar.bz2 # cd linux-3.2.143.配置內核並安裝 #make mrpr ...
一周排行
  • 通向架構師的道路第十九天使用maven構建Spring工程 轉
    一.前言 上次大家拿了我上傳的工程後,有些人自己通過spring3,struts1.3,h ...
  • 不小心翻出了兩年前寫的一篇文章,算得上是我的第一篇技術博客了~   ^ ^ 把fckeditor文件夾直接放在webroot文件夾下 把web.xml中的配置複制到project的web.xml中,不用改文件頭或別的 ...
  • C/C++拾遺二十:初識MFC框架
         這段時間專案任務緊,自己也不能保證時間每天一章了,只能抽零散的時間自己來學習MF ...
  • 第一次使用maven3,08年使用maven2,以後的産品基本都是ant了.maven默認的本地倉庫,默認情況下,不管是在windows還是linux上,每個用戶在自己的用戶目錄下都有一個路徑名爲.m2/reposi ...
  • 多少年來,許多的編程語言和工具都包含對正則表達式的支持,.NET基礎類庫中包含有一個名字空間和一系列可以充分發揮規則表達式威力的類,而且它們也都與未來的Perl 5中的規則表達式兼容.     此外,regexp類還 ...
  • 周末幫人完成一個專案,android5.0以上版本,誰知道被開發工具折騰的死去活來.我的開發環境是adt-bundle-windows-x0140702.zip版本,也是目前能找到的adt-bundle的最新 ...
  • 江湖棋局盲公自綁的著法
       揭曉一下<盲公自綁>棋局(紅先)的著法.只是,在第二種著法裡,過程中變數 ...
  •     前面在分析IPv6的數據流程時,當所有的信息都准備好了之後,例如,出口設備,下一跳的地址,以及鏈路層地址.就會調用dev.c文件中的dev_queue_xmin函數,該函數是設備驅動程序執行傳輸的接口.也就是 ...
  • 解決沖突:1.新建用來merge的分支git checkout formerge -b develop2.切換到develop分支git checkout develop2.將分支develop回退到fetch版本之 ...
  • google改動內容在這兒,沒有測試過,看起來沒問題. 到目前位置,市面上所有的Android設備,都存在這個這個小問題: 在Linux/Mac上執行adb命令輸出什麽東西時,就算是二進制輸出,那麽LF(0x0a)字 ...