天天看點

【linux指令學習】— iostat 指令學習

文章目錄

    • 一、指令相關參數
    • 二、輸出資訊
      • 1、cpu部分的統計
      • 2、磁盤部分的統計
    • 三、一些擴充
    • 參考資料

當我們要看系統IO情況時,一般最先想到的應該就是iostat指令的。iostat提供了豐富的參數給我們查詢各種次元的io資料。學習iostat有助于我們排查IO相關問題時可以更快的定位到問題根源。

以下内容大多來自iostat的man文檔,會加上部分自己的了解,英文水準好的同學也可以直接看man文檔

一、指令相關參數

指令使用:

iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | ... } [ device [...] | ALL ] ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

看着有點亂,我們可以歸納為:

iostat [-參數] [指定磁盤] [采集周期頻率] [采集次數]

比如

iostat -k sda 5 2

表示采集sda磁盤上的相關資訊,每5秒采集一次,一共采集2次。-k參數表示以kb來顯示。

相關參數介紹:

參數 詳解
-c 隻顯示cpu相關統計資訊(預設是同時顯示cpu和磁盤資訊)
-d 隻顯示磁盤統計資訊(預設是同時顯示cpu和磁盤資訊)
-h 使用NFS的輸出報告更加友好可讀。NFS通過-n來開啟
-j { ID | LABEL | PATH | UUID | … } 磁盤清單的Device列要用什麼次元來描述磁盤
-k 預設情況下,iostat的輸出是以block作為計量機關,加上這個參數可以以kb作為計量機關顯示。(該參數僅在linux核心版本2.4以後資料才是準确的)
-m 預設情況下,iostat的輸出是以block作為計量機關,加上這個參數可以以mb作為計量機關顯示。(該參數僅在linux核心版本2.4以後資料才是準确的)
-N 顯示磁盤陣列(LVM) 資訊
-n 顯示NFS相關統計資料(network fileSystem)。但是這個參數隻在linux核心版本2.6.17之後有用
-p [ { device [,…] | ALL } ] 顯示磁盤分區的相關統計資訊(預設粒度隻到磁盤,沒有顯示具體的邏輯分區)
-t 每次輸出報告時顯示系統時間,
-V 顯示目前iostat的版本資訊
-x 顯示更詳細的磁盤報告資訊,預設隻顯示六列,加上該參數後會顯示更詳細的資訊。這個參數也需要在核心版本2.4之後才能使用
-y 跳過不顯示第一次報告的資料,因為iostat使用的是采樣統計,是以iostat的第一次輸出的資料是自系統啟動以來累計的資料
-z 隻顯示在采樣周期内有活動的磁盤
通過uname -a可以檢視目前linux系統的核心版本。2.4版本後一個block的大小通常是512byte
預設情況下,第一次的輸出資訊的資料是從作業系統啟動以來的累計資料,第二次開始才是真正的采樣周期内的真實資料,這點和top指令很像。我們可以加上-y來過濾掉第一次的輸出資訊。

二、輸出資訊

iostat的輸出資訊主要可以分為3大部分:

  1. cpu部分的統計資訊
  2. 磁盤相關的統計資訊
  3. NFS(Network FileSystem)相關的統計資訊

預設情況下,iostat隻會顯示cpu和磁盤部分的統計資訊。如下圖:

【linux指令學習】— iostat 指令學習

加上-n可以顯示NFS的統計資訊。由于本人在多個系統上測試均沒有具體的數值輸出,是以下面隻介紹cpu和磁盤部分的統計資訊。

1、cpu部分的統計

這裡的cpu統計資訊隻是取平均值,如果是多核cpu,想看每核cpu的具體統計資訊,可以使用top指令。

下面的百分比計算一般采用公式: 消耗時間*100.0/采樣時間

  • %user: cpu消耗在使用者空間的時間占比
  • %nice: 被使用者修改過優先級的程序運作時間占比
  • %system: cpu消耗在核心空間的時間占比
  • %iowait: cpu在等待IO的時間占比(需要滿足CPU資源空閑而磁盤IO在工作的條件)
  • %steal: 當hypervisor正服務于另外一個虛拟處理器時無意識地等待虛拟CPU所占有的時間百分比
  • %idle: cpu空閑時間百分比
iowait可以作為磁盤是否是系統瓶頸的參考值,但并不能全信。iowait表示的含義是cpu沒在工作而在等待io的時間占比,在cpu高速運轉的情況下也會出現iowait高的情況,這并不能表明磁盤性能就有問題。唯一能說明磁盤性能差的應該是根據磁盤的read/write時間,一般來說,一次讀寫就是一次尋道+一次旋轉延遲+資料傳輸的時間。現代硬碟資料傳輸就是幾微秒或者幾十微秒的事情,遠遠小于尋道時間220ms和旋轉延遲48ms,是以隻計算這兩個時間就差不多了,也就是15~20ms。如果磁盤讀寫時間大于20ms,就要考慮是否是磁盤讀寫太多,導緻磁盤性能降低了。

2、磁盤部分的統計

在沒加

-x

參數時,預設輸出以下六列:

  • Device: 磁盤名稱,可以通過-p參數改成ID、PATH、UUID的形式
  • tps:取樣周期内,磁盤的讀寫次數。但是由于有時作業系統會合并多個IO請求成一個,是以這個參數并不是十分準确。
  • Blk_read/s:取樣周期内,每秒讀取的block數量(通過參數-k -m可以将機關改成kb、mb)
  • Blk_wrtn/s:取樣周期内,每秒寫入的block數量(通過參數-k -m可以将機關改成kb、mb)
  • Blk_read:取樣周期内,讀取的總block數量(通過參數-k -m可以将機關改成kb、mb)
  • Blk_wrtn:取樣周期内,寫入的總block數量(通過參數-k -m可以将機關改成kb、mb)

如果加了

-x

參數,會詳細更加詳細的資料,如下圖:

【linux指令學習】— iostat 指令學習
  • rrqm/s:采樣周期内,每秒merge的讀請求數量
  • wrqm/s:采樣周期内,,每秒merge的寫請求數量
  • r/s:采樣周期内,每秒的讀請求數量
  • w/s:采樣周期内,每秒的寫請求數量
  • rsec/s:采樣周期内,每秒讀取的扇區數量(通過參數-k -m可以将機關改成kb、mb)
  • wsec/s:采樣周期内,每秒寫入的扇區數量(通過參數-k -m可以将機關改成kb、mb)
  • avgrq-sz:采樣周期内,平均IO請求的大小(以扇區為機關)
  • avgqu-sz:采樣周期内,平均IO隊列長度(在等待被執行的IO請求)
  • await:采樣周期内,IO請求的平均時間(排隊時長+IO服務時長),機關是毫秒
  • svctm:采樣周期内,IO請求的平均服務時間,排除排隊的時長,機關是毫秒(該統計次元的數值不可信,後面的iostat版本會移除這項統計值)
  • %util:采樣周期内,IO忙碌的時間百分比,如果這個值接近100,說明此時IO已經滿負荷了

網上許多部落格都說用svctm可以衡量磁盤的性能,但是在iostat的man文檔中有提到,讓我們不要相信這個列的輸出值,并且在後面的版本中會去除這個統計項。

是以要統計磁盤性能,綜合來說還是用await列的資訊來判斷。一般的磁盤讀寫性能在20ms左右,如果await比這個數值大很多,就說明目前系統存在很大的IO問題。

三、一些擴充

和大多的系統名額統計一樣,iostat的資料也基本來自/proc虛拟檔案系統。不了解/proc虛拟檔案系統的同學自行百度,這裡就不多做介紹了。

比如 iostat -x 的資料則來自于 /proc/diskstats檔案下的資料。另外,各種linux發行版的proc虛拟檔案系統實作可能會有偏差,是以iostat輸出的内容也可能不太一緻。

參考資料

https://blog.51cto.com/291268154/1981358

https://bean-li.github.io/dive-into-iostat/

繼續閱讀