2019年8月19日 星期一

Linux I / O調度器

**  Linux I / O調度器
    Linux I / O調度器是控制內核提交讀寫請求給磁盤的方式。Linux的支持三種I / O電梯調度算法,分別為CFQ,Noop,Deadline三種。簡單介紹下這三種。

    **CFQ(完全公平調度程序)
    完全公平調度器(CFQ)自kernel2.6.18後成為了Linux默認的I / O調度器,它也是大多數Linux發行版的默認調度器。
    CFQ調度器的目的是為所有請求I / O操作的進程提供一個公平的磁盤I / O帶寬分配。
    CFQ調度器為每個進程單獨創建一個同步I / O隊列來管理其同步的請求然後為每個隊列分配訪問磁盤的時間片。
    時間片長度和隊列允許提交的請求數取決於其進程的I / O優先級。以此保證每個進程的I / O資源佔用是公平的。
    CFQ算法的特點是按照I / O請求的地址進行排序,而不是按照先來後到的順序進行響應。這樣減少了不必要的磁盤尋道,提高了吞吐量。
    但也意味著,先來的I / O請求可能不能盡快得到響應,可能出現餓死現象。

    **Deadline調度器主要目的是保證請求的啟動服務時間。它在所有的I / O請求上加上一個期限來防止請求餓死。
    除了本身提供的I / O排隊隊列之外,Deadline額外分為為讀I / O和寫I / O提供了FIFO隊列。排序隊列按照按照扇區數排序,FIFO隊列按照截止時間排序。
    FIFO隊列優先級高於排隊隊列,讀隊列優先級高於寫隊列。排序隊列使用紅黑樹結構,而FIFO使用鍊錶結構。讀FIFO隊列的最大等待時間為500ms,寫FIFO隊列的最大等待時間為5s。
    截止日期算法會在寫隊列沒有發生飢餓的情況下處理讀隊列,在進入讀隊列處理時,會首先檢查FIFO讀隊列查看是否有過期請求,如果有就優先處理它。
    如果前面寫隊列出現飢餓,意即FIFO寫隊列有過期請求,它就會進入寫隊列處理然後處理FIFO中過期的寫請求。
    截止日期本質還是基於CFQ的,只不過加了兩個FIFO隊列來避免餓死問題。
    Deadline調度器更適合用於多線程處理環境和數據庫環境。避免了CFQ調度器的餓死問題。

    **Noop調度器非常簡單,它提供了一個最簡單的FIFO隊列並對請求進行簡單的合併處理。
    當確定不需要根據扇區號來對請求排序時,這個調度器是非常高效的。比較適合在SSD上面應用。
    總的來看,Noop更適合固態硬盤。截止日期適合需要優先保證讀操作且避免餓死的情況如數據庫場景。
    CFQ比較複雜,容易出現餓死問題,但保證了盡可能的公平。推薦固態硬盤下可以考慮把默認的CFQ調度器改為Noop調度器或者Deadline調度器。

    更換Linux I / O調度器
    可以通過如下命令查看你當前的I / O調度器:
    cat /sys/block/sdb/queue/scheduler or
    for i in `ls /sys/block/*/queue/scheduler`; do echo $i;cat $i; done

    如果想修改的話,可以先進入su然後執行:
    echo noop > /sys/block/sdb/queue/scheduler
    把可以noop換位cfq或者deadline。

沒有留言:

張貼留言