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及以後的版本中有效。 除上面列出的幾種用法外,各種參數還可組合使用,限於篇幅,這裡不再展開。想瞭解的話,在自己機器上實驗一下,學習效果會更好。