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 缓存热点文件)。