Linux iostat 命令


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


免責聲明!

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



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