iostat 說明
iostat 用于監控系統 ?CPU 使用率? 和 ?磁盤 I/O 性能,是排查 I/O 瓶頸的關鍵工具。
iostat 參數說明
基本選項
| ?參數? |
?說明? |
-c |
僅顯示 ?CPU 使用率統計?(默認同時顯示 CPU 和設備報告)。 |
-d |
僅顯示 ?設備(磁盤)I/O 統計?(默認顯示 CPU + 設備)。 |
-h |
?人類可讀格式?(自動使用 KB、MB、GB 等單位)。 |
-k |
以 ?KB? 為單位顯示數據(默認塊數,1 塊=512B)。 |
-m |
以 ?MB? 為單位顯示數據。 |
-N |
顯示 ?設備映射名稱?(如 LVM 邏輯卷名 /dev/mapper/vg0-lv1)。 |
-s |
顯示 ?摘要報告?(合并設備統計,適合快速查看)。 |
-t |
輸出中增加 ?時間戳?(便于記錄性能變化時間點)。 |
-V |
顯示 ?版本信息。 |
-x |
顯示 ?擴展 I/O 統計?(包括 await、svctm、%util 等關鍵指標)。 |
-y |
跳過第一個統計結果(避免顯示系統啟動以來的累計數據)。 |
-z |
隱藏 ?零活動設備?(過濾未使用的磁盤,簡化輸出)。 |
| -j |
可選參數:ID | LABEL | PATH | UUID |
--dec={0|1|2} |
控制小數位數(0:整數,1:1 位小數,默認 2)。 |
--human |
同 -h,人類可讀格式。 |
-o JSON |
輸出為 ?JSON 格式?(便于自動化處理)。 |
-g <group_name> |
將設備分組統計(需配合 -H 顯示組標題)。 示例:iostat -g mygroup sda sdb。 |
-H |
顯示設備分組的標題(配合 -g 使用)。 |
| -p |
可選參數: <device> [,...] | ALL |
設備篩選
| 參數? |
?說明? |
<device> |
指定監控的 ?設備名?(如 sda、nvme0n1),可多個并列。 |
ALL |
監控 ?所有設備?(默認行為)。 |
監控頻率參數
| 參數? |
?說明? |
<interval> |
統計間隔(秒),持續輸出數據。 |
<count> |
統計次數(若省略,則無限循環)。 |
iostat 關鍵指標說明
| 指標? |
?說明? |
r/s |
?每秒讀請求次數?:反映設備的讀操作頻率。高值可能表示頻繁讀取小文件。 |
rkB/s |
?每秒讀取數據量(KB)??:實際讀取帶寬。結合 r/s 可判斷請求大小。 |
rrqm/s |
?每秒合并的讀請求數?:內核將相鄰請求合并后發送給磁盤,提升效率。 |
%rrqm |
?讀請求合并百分比?:(rrqm/s) / (r/s + rrqm/s) * 100%。高值表示請求局部性好。 |
r_await |
?讀請求平均等待時間(ms)??:從請求發起到完成的總時間(包括隊列等待 + 磁盤處理)。 |
rareq-sz |
?讀請求平均大小(KB)??:rkB/s / r/s。值越大,順序讀取特征越明顯。 |
w/s |
?每秒寫請求次數?:寫操作頻率。高值可能表示頻繁寫入日志或數據。 |
wkB/s |
?每秒寫入數據量(KB)??:實際寫入帶寬。 |
wrqm/s |
?每秒合并的寫請求數?:類似讀請求合并,優化寫入效率。 |
%wrqm |
?寫請求合并百分比?:(wrqm/s) / (w/s + wrqm/s) * 100%。 |
w_await |
?寫請求平均等待時間(ms)??:從請求發起到完成的總時間。 |
wareq-sz |
?寫請求平均大小(KB)??:wkB/s / w/s。 |
d/s |
?每秒丟棄請求次數?(SSD TRIM 操作)。 |
dkB/s |
?每秒丟棄數據量(KB)??:釋放的塊數量。 |
drqm/s |
?每秒合并的丟棄請求數。 |
%drqm |
?丟棄請求合并百分比。 |
d_await |
?丟棄請求平均等待時間(ms)?。 |
dareq-sz |
?丟棄請求平均大小(KB)?。 |
aqu-sz |
?平均 I/O 隊列長度?:正在處理和排隊的請求總數。值 > 1 表示存在排隊。 |
%util |
?設備帶寬利用率?:(處理 I/O 的時間) / 總時間 * 100%。達到 100% 表示飽和。 |
常用場景示例
實時監控磁盤 I/O 性能(關鍵指標)
iostat -dx 1 1 # 每 1 秒刷新,共 1 次,顯示擴展統計
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 05/07/2025 _x86_64_ (4 CPU)
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
dm-0 2.90 74.77 0.00 0.00 0.68 25.77 1.61 22.58 0.00 0.00 0.76 14.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.09
dm-1 0.02 0.44 0.00 0.00 0.20 22.85 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 2.97 76.88 0.00 0.00 0.61 25.86 0.55 22.59 1.06 65.76 0.67 40.88 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.09
監控 CPU 和設備 I/O
iostat -c -d -t -h 2 # 每 2 秒刷新,顯示 CPU、設備、時間戳和可讀單位
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 05/07/2025 _x86_64_ (4 CPU)
05/07/2025 03:25:56 PM
avg-cpu: %user %nice %system %iowait %steal %idle
0.0% 0.0% 0.2% 0.0% 0.0% 99.8%
tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd Device
3.88 64.0k 19.4k 0.0k 365.4M 110.8M 0.0k dm-0
0.02 0.4k 0.0k 0.0k 2.2M 0.0k 0.0k dm-1
3.03 65.8k 19.4k 0.0k 375.8M 110.8M 0.0k nvme0n1
| ?指標? |
?說明? |
?正常范圍? |
?異常處理? |
%user |
?用戶態 CPU 時間?:執行應用程序代碼的時間(如 Java、Python 進程)。 |
< 70% |
優化代碼邏輯、減少計算密集型操作。 |
%nice |
?調整優先級的用戶態 CPU 時間?:優先級降低(nice 值 >0)的進程消耗的時間。 |
< 5% |
檢查低優先級進程(如備份任務)是否影響關鍵業務。 |
%system |
?內核態 CPU 時間?:執行系統調用和內核任務的時間(如中斷處理、進程調度)。 |
< 30% |
高頻系統調用可能因配置不當(如小文件頻繁 I/O)或驅動問題。 |
%idle |
?CPU 空閑時間?:CPU 未執行任何任務的時間。 |
> 20% |
高空閑率通常正常,但結合 %iowait 可判斷是否存在 I/O 等待型瓶頸。 |
%iowait |
?I/O 等待時間?:CPU 空閑且等待磁盤 I/O 完成的時間。 |
< 20% |
高值需檢查磁盤性能(iostat -dx)、RAID 狀態或網絡存儲延遲。 |
%steal |
?虛擬化環境中的 CPU 搶占時間?:被 Hypervisor 分配給其他虛擬機的時間。 |
< 10% |
高值需擴容虛擬機 vCPU 或優化宿主資源分配。 |
| ?指標? |
?說明? |
?分析場景? |
tps |
?每秒傳輸次數?(Transfers Per Second):每秒完成的 I/O 操作次數(讀 + 寫 + 丟棄)。 |
高 tps 表示頻繁的小 I/O 請求(如數據庫事務),需結合 %util 判斷是否過載。 |
kB_read/s |
?每秒讀取數據量(KB)??:從設備讀取的數據速率。 |
高值可能因頻繁讀取大文件或緩存未命中,需優化緩存策略或升級存儲。 |
kB_wrtn/s |
?每秒寫入數據量(KB)??:向設備寫入的數據速率。 |
高值可能因日志寫入、數據持久化,需檢查寫入模式(順序/隨機)和磁盤類型。 |
kB_dscd/s |
?每秒丟棄數據量(KB)??(SSD TRIM 操作):標記不再使用的塊以便回收。 |
高值表示 SSD 正在優化性能,但頻繁 TRIM 可能影響壽命(需平衡)。 |
kB_read |
?自系統啟動以來讀取的總數據量(KB)?。 |
監控長期讀取負載,結合時間判斷是否合理(如備份任務)。 |
kB_wrtn |
?自系統啟動以來寫入的總數據量(KB)?。 |
評估磁盤寫入壽命(尤其 SSD),防止過度磨損。 |
kB_dscd |
?自系統啟動以來丟棄的總數據量(KB)?。 |
跟蹤 SSD 維護行為,判斷 TRIM 策略是否有效。 |
Device |
?塊設備名稱?(如 /dev/sda、nvme0n1),可能包含 LVM 邏輯卷或分區。 |
|
生成 JSON 報告
iostat -o JSON -j UUID 1 1 # 輸出 JSON 格式,按 UUID 標識設備
{"sysstat": {
"hosts": [
{
"nodename": "localhost.localdomain",
"sysname": "Linux",
"release": "4.19.90-2102.2.0.0062.ctl2.x86_64",
"machine": "x86_64",
"number-of-cpus": 4,
"date": "05/07/2025",
"statistics": [
{
"avg-cpu": {"user": 0.03, "nice": 0.01, "system": 0.17, "iowait": 0.01, "steal": 0.00, "idle": 99.78},
"disk": [
{"disk_device": "01d05e20-f584-4296-b9dc-14f245c7cb99", "tps": 3.62, "kB_read/s": 59.50, "kB_wrtn/s": 18.08, "kB_dscd/s": 0.00, "kB_read": 374205, "kB_wrtn": 113720, "kB_dscd": 0},
{"disk_device": "fdbf2d58-e7be-4278-a90b-096fa02d5829", "tps": 0.02, "kB_read/s": 0.35, "kB_wrtn/s": 0.00, "kB_dscd/s": 0.00, "kB_read": 2216, "kB_wrtn": 0, "kB_dscd": 0},
{"disk_device": "nvme0n1", "tps": 2.82, "kB_read/s": 61.18, "kB_wrtn/s": 18.09, "kB_dscd/s": 0.00, "kB_read": 384770, "kB_wrtn": 113764, "kB_dscd": 0}
]
}
]
}
]
}}
分組統計多塊磁盤
iostat -g mydisk -H sdb sdc # 將 sdb 和 sdc 合并為 "mydisk" 組
Linux 4.19.90-2102.2.0.0062.ctl2.x86_64 (localhost.localdomain) 05/07/2025 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.01 0.17 0.01 0.00 99.78
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
mydisk 0.00 0.00 0.00 0.00 0 0 0
iostat 性能瓶頸診斷
CPU 瓶頸判斷
用戶態 CPU 高(%user 高)
現象:%user > 70%,%idle < 20%。
原因:應用程序計算密集型操作(如加密、壓縮、算法處理)。
內核態 CPU 高(%system 高)
現象:%system > 30%,%iowait 低。
原因:
高頻系統調用(如小文件頻繁 I/O)。
網絡中斷處理(如高 PPS 網絡流量)。
磁盤 I/O 瓶頸
磁盤帶寬飽和(%util 高)
現象:%util >= 90%,rkB/s 或 wkB/s 接近磁盤理論帶寬。
原因:
順序讀寫大文件(如視頻流、備份操作)。
磁盤帶寬達到物理限制。
優化:
升級更高帶寬的磁盤(如 HDD → SSD → NVMe)。
使用 RAID 0 或分布式存儲橫向擴展。
I/O 延遲高(await 高)
現象:await > 10 ms(機械盤)或 await > 2 ms(SSD)。
原因:
隨機 I/O 過多(如數據庫索引未命中)。
磁盤隊列堆積(aqu-sz > 1)。
優化:
優化應用 I/O 模式(如增大塊大小、預讀數據)。
使用 SSD 替代機械盤。
I/O 請求合并率低(%rrqm/%wrqm 低)
現象:%rrqm < 50% 或 %wrqm < 50%,rareq-sz/wareq-sz 小。
原因:隨機 I/O 請求分散,無法合并。
優化:
調整文件系統塊大小(如 mkfs.ext4 -b 4096)。
使用緩存技術(如 vmtouch 緩存熱點文件)。