iostat 用於輸出 CPU 和磁盤 I/O 相關的統計信息。


iostat 用於輸出 CPU 和磁盤 I/O 相關的統計信息。
 
命令格式:
     iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ][ device [...] | ALL ] [ -p [ device | ALL ] ] [ interval [ count ]]
 
 
1) iostat 命令的簡單使用
    iostat 命令可以顯示 CPU 和 I/O 系統的負載情況及分區狀態信息。
    直接執行 iostat 命令可以顯示下面的內容:
 
# iostat
 
# iostat -xm 
(帶 xm 參數顯示擴展信息並將磁盤數據有每扇區改為每兆顯示【1扇區等於512字節】)
Linux 2.6.33.3 ((none))   12/17/10
 
avg-cpu:   %user     %nice    %system    %ioswait   %stcal    %idle
                  0.05        0.00        2.00              0.03        0.00      97.92
Device:     rrqm/s         wrqm/s     r/s     w/s     rMB/s    wMB/s   
 
 
 
各項輸出項目的含義如下:
 
avg-cpu 段:
%user:  在用戶級別運行所使用 CPU 的百分比。
%nice:  nice 操作所使用 CPU 的百分比。
%sys: 在系統級別(kernel)運行所使用 CPU 的百分比。
%iowait: CPU等待硬件 I/O 時,所占用 CPU 百分比。
%idle:  CPU 空閑時間的百分比。
 
Device段:
tps:每秒鍾發送到的 I/O 請求數
Blk_read/s:每秒讀取的 block 數
Blk_wrtn/s:每秒寫入的 block 數
Blk_read:讀入的 block 總數
Blk_wrtn:寫入的 block 總數
 
 
2) iostat 命令的參數說明
iostat 各個參數說明:
 
-c  僅顯示 CPU 統計信息。與 -d 選項互斥。
-d  僅顯示磁盤統計信息。與 -c 選項互斥。
-k  以 K 為單位顯示每秒的磁盤請求數,默認單位塊。
-p device | ALL
     與 -x 選項互斥,用於顯示塊設備及系統分區的統計信息,也可以在 -p 后指定一個設備名,如:
          # iostat -p hda
     或顯示所有設備:
           # iostat -p ALL
-t  在輸出數據時,打印收集數據的時間。
-V  打印版本號和幫助信息。
-x  輸出擴展信息。
 
 
3) iostat 命令輸出項目說明
 
Blk_read  讀入塊的總數
Blk_wrtn  寫入塊的總數
kB_read/s  每秒從驅動器讀入的數據量,單位為 K。
kB_wrtn/s  每秒向驅動器寫入的數據量,單位為 K。
kB_read  讀入的數據總量,單位為 K。
kB_wrtn  寫入的數據總量,單位為 K。
wrqm/s  將寫入請求合並后,每秒發送到設備的寫入請求數。
r/s  每秒發送到設備的讀入請求數。
w/s  每秒發送到設備的寫入請求數。
rsec/s  每秒從設備讀入的扇區數。
wsec/s  每秒向設備寫入的扇區數。
rkB/s  每秒從設備讀入的數據量,單位為 K。
wkB/s  每秒向設備寫入的數據量,單位為 K。
avgrq-sz  發送到設備的請求的平均大小,單位是 扇區。
avgqu-sz  發送到設備的請求的平均隊列長度。
await  I/O 請求平均執行時間,包括發送請求和執行的時間。單位是 毫秒。
svctm  發送到設備的 I/O 請求的平均執行時間。單位是 毫秒。
%util  在 I/O 請求發送到設備期間,占用 CPU 時間的百分比。用於顯示設備的帶寬利用率。
          當這個值接近 100% 時,表示設備帶寬已經占滿。
 
 

IO調度器(IO Scheduler)是操作系統用來決定塊設備上IO操作提交順序的方法。存在的目的有兩個,一是提高IO吞吐量,二是降低IO響應時間。然而IO吞吐量和IO響應時間往往是矛盾的,為了盡量平衡這兩者,IO調度器提供了多種調度算法來適應不同的IO請求場景。其中,對數據庫這種隨機讀寫的場景最有利的算法是DEANLINE。接着我們按照從簡單到復雜的順序,迅速掃一下Linux 2.6內核提供的幾種IO調度算法。

1、NOOP NOOP算法的全寫為No Operation。該算法實現了最最簡單的FIFO隊列,所有IO請求大致按照先來后到的順序進行操作。之所以說“大致”,原因是NOOP在FIFO的基礎上還做了相鄰IO請求的合並,並不是完完全全按照先進先出的規則滿足IO請求。 假設有如下的io請求序列: 100,500,101,10,56,1000 NOOP將會按照如下順序滿足: 100(101),500,10,56,1000

2、CFQ CFQ算法的全寫為Completely Fair Queuing。該算法的特點是按照IO請求的地址進行排序,而不是按照先來后到的順序來進行響應。 假設有如下的io請求序列: 100,500,101,10,56,1000 CFQ將會按照如下順序滿足: 100,101,500,1000,10,56在傳統的SAS盤上,磁盤尋道花去了絕大多數的IO響應時間。CFQ的出發點是對IO地址進行排序,以盡量少的磁盤旋轉次數來滿足盡可能多的IO請求。在CFQ算法下,SAS盤的吞吐量大大提高了。但是相比於NOOP的缺點是,先來的IO請求並不一定能被滿足,可能會出現餓死的情況。

3、DEADLINE DEADLINE在CFQ的基礎上,解決了IO請求餓死的極端情況。除了CFQ本身具有的IO排序隊列之外,DEADLINE額外分別為讀IO和寫IO提供了FIFO隊列。讀FIFO隊列的最大等待時間為500ms,寫FIFO隊列的最大等待時間為5s。FIFO隊列內的IO請求優先級要比CFQ隊列中的高,,而讀FIFO隊列的優先級又比寫FIFO隊列的優先級高。優先級可以表示如下: FIFO(Read) > FIFO(Write) > CFQ

4、ANTICIPATORY 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響應時間非常短。

查看和修改IO調度器的算法非常簡單。假設我們要對sda進行操作,如下所示: cat /sys/block/sda/queue/scheduler echo “cfq” > /sys/block/sda/queue/scheduler


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM