linux iostat命令輸出簡要說明
iostat是Linux系統內置工具,用於查看機器的CPU時間片分配情況統計或硬盤IO統計。由於強大的top命令的存在(輸出更詳細的CPU/Memory統計數據),因此,在絕大多數場合下,iostat用來查看硬盤設備的IO狀態,在分析機器IO壓力或瓶頸時尤其有用。
本筆記主要參考了man iostat英文解釋,旨在說明iostat的典型用法及其輸出數據的含義。
1. iostat的默認輸出
在shell終端輸入iostat命令後,其默認輸出如下:
[plain]
Linux 2.6.9xenu_7-0-0-0 (demo-hostname) 06/21/2013
avg-cpu: %user %nice %sys %iowait %idle
1.65 0.00 0.62 0.60 97.12
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda1 1.29 1.09 12.38 11546642 130611280
sda2 0.00 0.00 0.00 296 0
sda3 11.79 142.71 395.95 1505879770 4178084600
由man可知,若iostat在該機器上是首次執行,則輸出統計的采集時間范圍為機器啟動時刻到本次iostat命令執行時刻的時間段。否則,采集時間范圍為上次iostat執行時刻到本次執行時刻的時間段。
從輸出內容可知,iostat先輸出的第1行為linux kernel version及hostname及命令運行時刻,後面幾行的內容則分為2部分:cpu統計;Device統計,下面分別說明。
1)cpu統計輸出
在kernel 2.6.9的機器上,avg-cpu輸出內容由5個字段構成,其中%user/%nice/%sys/%idle比較容易理解,此處不再贅述。%iowait表示由於機器響應磁盤IO請求導致的CPU空閒時間,對於部署有IO密集型應用的機器,該字段的值通常比CPU密集型的機器對該字段的統計值要大。
在kernel版本為2.6.32的機器中,可能還會有%steal字段,其含義為:
Show the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.
2)Device統計輸出
這裡的Device通常就是hard disk,即硬盤。輸出包括6個字段,下面分別說明。
Device: 機器上的設備列表,通常是塊設備名(在linux中,與塊設備相對應的是字符設備,兩者的區別可以參考這裡來了解)或分區名,如上面示例中的sda1/sda2/sda3;
tps: 每秒針對設備的傳輸次數(transfers),這裡的"傳輸"是指I/O請求。需要注意的是,邏輯上的多次請求可能會被操作系統優化合並為一次I/O請求,linux系統對磁盤訪問的調度算法就采用了這個策略(若感興趣,可在這篇文章中搜索關鍵詞"merging"來了解linux的io scheduler對requests merging的優化);
Blk_read/s: 每秒從設備讀取的數據大小,在這裡,數據量以block為單位來描述。在kernel 2.4及之後版本中,block即指扇區(sector),因此,1 block = 512 bytes;在kernel 2.4之前的版本中,block的大小不確定;
Blk_wrtn/s: 每秒向設備寫入的數據大小,數據大小同樣用block來描述;
Blk_read: 系統上電以來,從設備讀取的數據總數(單位:block);
Blk_wrtn: 系統上電以來,向設備寫入的數據總數(單位:block)。
2. iostat -d -k或iostat -c
iostat不加任何參數時,默認輸出avg-cpu及device兩種統計數據。若我們只關心device的統計數據,可以用-d來顯式指明只輸出device相關的統計。另外,device的統計數據默認單位是block(=512Kbytes),我們可以用-k來指定輸出的統計數據值以kilobytes為單位。
例如,在shell終端輸入iostat -d -k後,輸出格式如下所示:
[plain]
Linux 2.6.9xenu_7-0-0-0 (demo-hostname) 06/29/2013
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda1 1.29 0.51 6.16 5789577 69260268
sda2 0.00 0.00 0.00 148 0
sda3 11.23 67.20 187.49 755494461 2107939224
可以看到,與默認輸出格式相比,此次輸出內容有4個字段名及數值均有所變化:字段名從Blk_xxx變為kB_xxx(表明這些字段的單位從block變為kB),數值也大概變為原來的512倍。
若我們只關心avg-cpu的統計數據,則可以通過iostat -c來顯式指定。
3. iostat其它用法
1)iostat interval count
iostat默認是調用一次才輸出一次統計結果,在實際使用中,通常會有只調一次,然後自動按某固定時間間隔連續輸出n次的需求。此時可借助可選的interval和count參數來達到這個目的(關於這兩個參數,可man查看)。例如iostat 1 100表示每隔1s輸出一次,共輸出100次
2)iostat -p device | ALL
當linux主機由多塊磁盤,而我們只關心某個或某幾個設備的統計數據時,可以通過iostat -p sda1 [sda2] [sdan]來顯式指明僅輸出指定設備的統計數據。
iostat -p ALL則表明需要輸出系統中定義的所有塊設備或分區的統計數據,包括從未被用到的那些設備。此時,輸出內容可能會出現ram0之類的設備名,它表示ramdisk,想了解的同學可以查看這裡https://wiki.archlinux.org/index.php/Ramdisk。
注:ALL參數只在kernel 2.5及以後的版本中有效。
除上面列出的幾種用法外,各種參數還可組合使用,限於篇幅,這裡不再展開。想了解的話,在自己機器上試驗一下,學習效果會更好。