【整理】Linux I/O調度

來源:互聯網
上載者:User

一) I/O發送器的總結

    1) 當向裝置寫入資料區塊或是從裝置讀出資料區塊時,請求都被安置在一個隊列中等待完成.
    2) 每個塊裝置都有它自己的隊列.
    3) I/O發送器負責維護這些隊列的順序,以更有效地利用介質.I/O發送器將無序的I/O操作變為有序的I/O操作.
    4) 核心必須首先確定隊列中一共有多少個請求,然後才開始進行調度.

 

二) I/O調度的4種演算法

    1) CFQ(Completely Fair Queuing, 完全公平排隊)

    特點:
        在最新的核心版本和發行版中,都選擇CFQ做為預設的I/O調度器,對於通用的伺服器也是最好的選擇.
        CFQ試圖均勻地分布對I/O頻寬的訪問,避免進程被餓死並實現較低的延遲,是deadline和as調度器的折中.
        CFQ對於多媒體應用(video,audio)和案頭系統是最好的選擇.
        CFQ賦予I/O請求一個優先順序,而I/O優先順序請求獨立於進程優先順序,高優先順序進程的讀寫不能自動地繼承高的I/O優先順序.

    工作原理:
        CFQ為每個進程/線程單獨建立一個隊列來管理該進程所產生的請求,也就是說每個進程一個隊列,各隊列之間的調度使用時間片來調度,以此來保證每個進程都能被很好的分配到I/O頻寬.I/O調度器每次執行一個進程的4次請求.

    2) NOOP(電梯式發送器)

    特點:
        在Linux2.4或更早的版本的發送器,那時只有這一種I/O調度演算法.
        NOOP實現了一個FIFO隊列,它像電梯的工作主法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合并到最近的請求之後,以此來保證請求同一介質.
        NOOP傾向餓死讀而利於寫.
        NOOP對於快閃記憶體裝置,RAM,嵌入式系統是最好的選擇.

    電梯演算法餓死讀請求的解釋:
        因為寫請求比讀請求更容易.
        寫請求通過檔案系統cache,不需要等一次寫完成,就可以開始下一次寫操作,寫請求通過合并,堆積到I/O隊列中.
        讀請求需要等到它前面所有的讀操作完成,才能進行下一次讀操作.在讀操作之間有幾毫秒時間,而寫請求在這之間就到來,餓死了後面的讀請求.

 

    3) Deadline(截止時間發送器)

    特點:
        通過時間以及硬碟地區進行分類,這個分類和合并要求類似於noop的發送器.
        Deadline確保了在一個截止時間內服務要求,這個截止時間是可調整的,而預設讀期限短於寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.
        Deadline對資料庫環境(ORACLE RAC,MYSQL等)是最好的選擇.

    4) AS(預料I/O發送器)

    特點:
        本質上與Deadline一樣,但在最後一次讀操作後,要等待6ms,才能繼續進行對其它I/O請求進行調度.
        可以從應用程式中預訂一個新的讀請求,改進讀操作的執行,但以一些寫操作為代價.
        它會在每個6ms中插入新的I/O操作,而會將一些小寫入流合并成一個大寫入流,用寫入延時換取最大的寫入輸送量.
        AS適合於寫入較多的環境,比如檔案伺服器
        AS對資料庫環境表現很差.

 

三) I/O調度方法的查看與設定

    1) 查看當前系統的I/O調度

        [root@test1 tmp]# cat /sys/block/sda/queue/scheduler
        noop anticipatory deadline [cfq]

    2) 臨時更改I/O調度
        例如:想更改到noop電梯調度演算法:
        echo noop > /sys/block/sda/queue/scheduler

    3) 永久更改I/O調度
        修改核心引導參數,加入elevator=發送器名
        [root@test1 tmp]# vi /boot/grub/menu.lst
        更改到如下內容:
        kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

        重啟之後,查看調度方法:
        [root@test1 ~]# cat /sys/block/sda/queue/scheduler
        noop anticipatory [deadline] cfq
        已經是deadline了

四) I/O發送器的測試

    本次測試分為唯讀,唯寫,讀寫同時進行,分別對單個檔案600MB,每次讀寫2M,共讀寫300次.

    1) 測試磁碟讀
        [root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 6.81189 seconds, 92.4 MB/s

         real    0m6.833s
         user    0m0.001s
         sys     0m4.556s

        [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 6.61902 seconds, 95.1 MB/s

        real    0m6.645s
        user    0m0.002s
        sys     0m4.540s

        [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 8.00389 seconds, 78.6 MB/s

        real    0m8.021s
        user    0m0.002s
        sys     0m4.586s

        [root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 29.8 seconds, 21.1 MB/s

        real    0m29.826s
        user    0m0.002s
        sys     0m28.606s

         結果:
        第一 noop:用了6.61902秒,速度為95.1MB/s
        第二 deadline:用了6.81189秒,速度為92.4MB/s
        第三 anticipatory:用了8.00389秒,速度為78.6MB/s
        第四 cfq:用了29.8秒,速度為21.1MB/s

    2) 測試寫磁碟
        [root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 6.93058 seconds, 90.8 MB/s

        real    0m7.002s
        user    0m0.001s
        sys     0m3.525s

        [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 6.79441 seconds, 92.6 MB/s

        real    0m6.964s
        user    0m0.003s
        sys     0m3.489s

        [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 9.49418 seconds, 66.3 MB/s

        real    0m9.855s
        user    0m0.002s
        sys     0m4.075s

        [root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 6.84128 seconds, 92.0 MB/s

        real    0m6.937s
        user    0m0.002s
        sys     0m3.447s

        測試結果:
        第一 anticipatory,用了6.79441秒,速度為92.6MB/s
        第二 deadline,用了6.84128秒,速度為92.0MB/s
        第三 cfq,用了6.93058秒,速度為90.8MB/s
        第四 noop,用了9.49418秒,速度為66.3MB/s

    3) 測試同時讀/寫

        [root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 15.1331 seconds, 41.6 MB/s

        [root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 36.9544 seconds, 17.0 MB/s

        [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 23.3617 seconds, 26.9 MB/s

        [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
        [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
        300+0 records in
        300+0 records out
        629145600 bytes (629 MB) copied, 17.508 seconds, 35.9 MB/s

        測試結果:
        第一 deadline,用了15.1331秒,速度為41.6MB/s
        第二 noop,用了17.508秒,速度為35.9MB/s
        第三 anticipatory,用了23.3617秒,速度為26.9MS/s
        第四 cfq,用了36.9544秒,速度為17.0MB/s

 

五) ionice

    ionice可以更改任務的類型和優先順序,不過只有cfq發送器可以用ionice.
    有三個例子說明ionice的功能:
    採用cfq的即時調度,優先順序為7
        ionice -c1 -n7  -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
    採用預設的磁碟I/O調度,優先順序為3
        ionice -c2 -n3  -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
    採用閒置磁碟調度,優先順序為0
        ionice -c3 -n0  -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

    ionice的三種調度方法,即時調度最高,其次是預設的I/O調度,最後是閒置磁碟調度.
    ionice的磁碟調度優先順序有8種,最高是0,最低是7.
    注意,磁碟調度的優先順序與進程nice的優先順序沒有關係.
    一個是針對進程I/O的優先順序,一個是針對進程CPU的優先順序.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.