Linux iostat 命令

sparkdev發表於2019-02-25

iostat 命令是 I/O statistics(輸入/輸出統計)的縮寫,用來報告系統的 CPU 統計資訊和塊裝置及其分割槽的 IO 統計資訊。iostat 是 sysstat 工具集的一個工具,在 Ubuntu 系統中預設是不帶 iostat 命令的,需要自行安裝:
$ sudo apt install sysstat
注意:本文中 demo 的演示環境為 ubuntu 18.04。

主要作用

iostat 主要用於監控系統裝置的 IO 負載情況,iostat 首次執行時顯示自系統啟動開始的各項統計資訊,之後執行 iostat 將顯示自上次執行該命令以後的統計資訊。
iostat 的特點是彙報磁碟活動統計情況,同時也會彙報出 CPU 使用情況。CPU 統計資料是作為所有處理器之間的平均值在系統範圍內計算的。iostat 也有一個弱點,就是它不能對某個程式進行深入分析,僅對系統的整體情況進行分析。

基本語法

語法格式:
iostat <options> <device name>

常用選項:
-c 只顯示 CPU 的資訊
-d 只顯示裝置資訊
--human 以友好的方式顯示結果
-j { ID | LABEL | PATH | UUID | ... }  顯示裝置的持久化名稱
-k  以 k 為單位顯示
-m 以 m 為單位顯示
-N 顯示任何裝置對映器裝置的註冊裝置對映器名稱,用於檢視LVM2統計資料
-p [ { device [,...] | ALL } ] 顯示塊裝置及其分割槽的資訊
-t 顯示每次輸出的時間
-V 顯示 iostat 的版本資訊
-x 顯示更多的裝置列
-z 如果沒有變化就不重複輸出資訊
interval 連續輸出,每 interval 秒輸出一次
count 與 interval 連用,指定一共輸出多少次

CPU 資訊

iostat 輸出中的 CPU 部分是對 CPU 使用情況的統計資訊(以百分比的形式顯示):

user
程式在使用者地址空間中消耗 CPU 時間的百分比。像 shell 程式、各種語言的編譯器、資料庫應用、web 伺服器和各種桌面應用都算是執行在使用者地址空間的程式。這些程式如果不是處於 idle 狀態,那麼絕大多數的 CPU 時間都是執行在使用者態。

nice
可以通過 nice 值調整程式使用者態的優先順序。這裡顯示的是調整過 nice 值的程式消耗掉的 CPU 時間。如果系統中沒有程式被調整過 nice 值,那麼 ni 就顯示為 0。

system
程式在核心地址空間中消耗 CPU 時間的百分比。所有程式要使用的系統資源都是由 Linux 核心處理的。當處於使用者態(使用者地址空間)的程式需要使用系統的資源時,比如需要分配一些記憶體、或是執行 IO 操作、再或者是去建立一個子程式,此時就會進入核心態(核心地址空間)執行。事實上,決定程式在下一時刻是否會被執行的程式排程程式就執行在核心態。對於作業系統的設計來說,消耗在核心態的時間應該是越少越好。在實踐中有一類典型的情況會使 sy 變大,那就是大量的 IO 操作,因此在調查 IO 相關的問題時需要著重關注它。

iowait
CPU 等待磁碟 IO 操作的時間。和 CPU 的處理速度相比,磁碟 IO 操作是非常慢的。有很多這樣的操作,比如:CPU 在啟動一個磁碟讀寫操作後,需要等待磁碟讀寫操作的結果。在磁碟讀寫操作完成前,CPU 只能處於空閒狀態。Linux 系統在計算系統平均負載時會把 CPU 等待 IO 操作的時間也計算進去,所以在我們看到系統平均負載過高時,可以通過 iowait 來判斷系統的效能瓶頸是不是過多的 IO 操作造成的。

steal
只有 Linux 在作為虛擬機器執行時 steal 才是有意義的。它表示虛機等待 CPU 資源的時間(虛機分到的是虛擬 CPU,當需要真實的 CPU 時,可能真實的 CPU 正在執行其它虛機的任務,所以需要等待)。

idle
CPU 處於 idle 狀態的百分比。一般情況下, user + nice + idle 應該接近 100%。

裝置資訊

裝置報告提供每個物理裝置或分割槽的統計資訊。可以在命令列中指定要顯示統計資訊的塊裝置和分割槽。如果沒有輸入裝置或分割槽,那麼將顯示系統使用的每個裝置的統計資訊,並提供核心為其維護統計資訊。如果命令列上給出了 ALL 關鍵字,那麼將顯示系統定義的每個裝置的統計資訊,包括那些從未使用過的裝置。預設情況下,傳輸速率顯示在 1K 塊中,除非設定環境變數POSIXLY_CORRECT,在這種情況下使用 512 位元組塊。根據所使用的標誌,報告可顯示以下欄位:

Device
Device 列顯示 /dev 目錄中列出的裝置(或分割槽)名稱。

tps
每秒傳送到裝置的 I/O 請求數。多個邏輯請求可以組合成對裝置的單個 I/O 請求。

Blk_read/s
每秒讀取的磁碟塊的數量。

Blk_wrtn/s
每秒寫入的磁碟塊的數量。

Blk_read
讀取的塊的總數。

Blk_wrtn
寫入的總塊數。

r/s
裝置每秒完成的讀請求數(合併後)。

w/s
裝置每秒完成的寫請求數(合併後)。

sec/s
每秒從裝置讀取或寫入的扇區數。

rsec/s
每秒從裝置讀取的扇區數。

wsec/s
每秒寫入裝置的扇區數。

rqm/s
每秒鐘排隊到裝置的合併後的 I/O 請求數量。

rrqm/s
每秒鐘排隊到裝置的合併後的讀請求數。

wrqm/s
每秒鐘排隊到裝置的合併後的寫請求數。

%rrqm
在傳送到裝置之前合併到一起的讀請求的百分比。

%wrqm
在傳送到裝置之前合併到一起的寫請求的百分比。

areq-sz
向裝置發出的 I/O 請求的平均大小(單位為 k)。

rareq-sz
向裝置發出的讀請求的平均大小(單位為 k)。

wareq-sz
向裝置發出的寫請求的平均大小(單位為 k)。

await
平均每次 I/O 操作的時間(以毫秒為單位)。這包括請求在佇列中花費的時間和執行它們所花費的時間。

r_await
平均每次讀請求的時間(以毫秒為單位)。這包括請求在佇列中花費的時間和執行它們所花費的時間。

w_await
平均每次寫請求的時間(以毫秒為單位)。這包括請求在佇列中花費的時間和執行它們所花費的時間。

aqu-sz
傳送到裝置的請求的平均佇列長度。

%util
向裝置發出 I/O 請求的執行時間百分比(裝置的頻寬利用率),換句話說就是一秒中有百分之多少的時間用於 I/O 操作。當連續處理請求的裝置的這個值接近100%時,說明產生的 I/O 請求太多,I/O 系統已經滿負荷,該磁碟可能存在瓶頸。但是對於並行處理請求的裝置,例如 RAID 陣列和現代 SSD,這個數字並不反映它們的效能限制。

常見用法

預設顯示 CPU 資訊和所有的裝置資訊

$ iostat

只顯示 CPU 的資訊

$ iostat -c

只顯示裝置資訊

$ iostat -d

還可以指定只顯示某一個或多個裝置的資訊

顯示塊裝置及其分割槽的資訊

$ iostat -d -p sdb

還可以通過逗號分隔同時指定多個磁碟裝置:

以 M 為單位顯示數字

$ iostat -m -d sdb

顯示時間戳

$ iostat -t -d sdb

顯示更多的裝置資訊

$ iostat -x -d sda

連續輸出
iostat 支援連續地輸出資訊,我們只要指定一個以秒為單位的間隔時間就行了:

$ iostat 2 -d sda

此時,每隔兩秒會輸出一次資訊。還可以再指定一個數字告訴 iostat 一共輸出多少次資訊,比如每隔兩秒輸出一次,一共輸出三次的寫法為:

$ iostat 2 3 -d sda

顯示 LVM2 裝置的對映名稱

$ iostat -d -N

顯示裝置的持久化名稱

$ iostat -d -j ID

除了 ID,還可以指定 LABEL、PATH 和 UUID 等顯示方式。

參考:
iostat man page

相關文章