iostat 是Linux系统上查看 I/O性能 最基本的工具,其全称为 I/O statistics。
iostat 主要用于输出 磁盘IO 和 CPU 的统计信息。
iostat 有以下缺陷:
iostat 的输出结果大多数是 一段时间内的平均值,因此难以反映峰值情况;
iostat 仅能对 系统整体情况进行分析汇报,却不能针对某个进程进行深入分析;
iostat 未单独统计IO处理信息,而是 将IO处理时间 和 IO等待时间 合并统计,因此包括await在内的指标并不能非常准确地衡量磁盘性能表现。
# iostat -help
Usage: iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ [ -T ] -g ] [ -p [ [,...] | ALL ] ]
[ [...] | ALL ]
参数说明:
| 选项 | 说明 |
|---|---|
-c | 显示CPU统计信息,与-d选项互斥 |
-d | 显示磁盘统计信息,与-c选项互斥 |
-k | 以K为单位显示每秒的磁盘请求数,默认单位块 |
-m | 以K为单位显示每秒的磁盘请求数 |
-N | 显示磁盘阵列(LVM) 信息 |
-t | 在输出数据时,打印搜集数据的时间 |
-V | 打印版本号和帮助信息 |
-x | 显示详细信息 |
-p | 显示磁盘和分区的情况 |
命令:
iostat -c
输出:
Linux 3.10.0-957.el7.x86_64 (docp010000007115) 11/24/2022 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.16 0.00 2.70 0.13 6.92 83.09
说明:
avg-cpu 描述的是 系统cpu使用情况 。
| 字段 | 说明 |
|---|---|
%user | CPU处在用户模式下的时间百分比 |
%nice | CPU处在带NICE值的用户模式下的时间百分比 |
%system | CPU处在系统模式下的时间百分比 |
%iowait | CPU等待输入输出完成时间的百分比 |
%steal | 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比 |
%idle | CPU空闲时间百分比 |
备注:
%iowait 的值过高,表示硬盘存在I/O瓶颈;
%idle 值高,表示CPU较空闲;
%idle 值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量;
%idle 值 持续低于10%,表明 CPU处理能力相对较低,系统中最需要解决的资源是CPU;
命令:
iostat -d
输出:
Linux 3.10.0-957.el7.x86_64 (docp010000007115) 11/24/2022 _x86_64_ (8 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 18.10 9.85 281.83 116143476 3322761606
scd1 0.00 0.00 0.00 198 0
dm-0 0.83 3.36 9.24 39619595 108967388
dm-1 0.02 0.01 0.07 173940 772676
dm-2 13.98 6.47 272.52 76318168 3213006082
说明:
Device 项描述的是 系统磁盘 使用情况 。
| 字段 | 说明 |
|---|---|
tps | 该设备每秒的传输次数,“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”,“一次传输”请求的大小是未知的 |
kB_read/s | 每秒从设备(drive expressed)读取的数据量 |
kB_wrtn/s | 每秒向设备(drive expressed)写入的数据量 |
kB_read | 读取的总数据量 |
kB_wrtn | 写入的总数据量 |
命令:
iostat -d -x -k
输出:
Linux 3.10.0-957.el7.x86_64 (docp010000007115) 11/24/2022 _x86_64_ (8 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.49 0.56 17.54 9.85 281.83 32.23 0.06 3.40 10.54 3.17 1.29 2.33
scd1 0.00 0.00 0.00 0.00 0.00 0.00 7.33 0.00 0.96 0.96 0.00 0.96 0.00
dm-0 0.00 0.00 0.08 0.75 3.36 9.24 30.46 0.00 4.61 11.05 3.95 0.71 0.06
说明:
| 字段 | 说明 |
|---|---|
rrqm/s | 每秒合并读操作的次数,如果两个读操作读取相邻的数据块时,可以被合并成一个,以提高效率。合并的操作通常是I/O scheduler(也叫elevator)负责的。 |
wrqm/s | 每秒合并写操作的次数 |
r/s | 每秒读操作的次数 |
w/s | 每秒写操作的次数 |
rkB/s | 每秒读取的字节数(KB) |
wkB/s | 每秒写入的字节数(KB) |
avgrq-sz | 每个IO的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位 |
avgqu-sz | 平均未完成的IO请求数量,即平均意义上的请求队列长度 |
await | 平均每个IO所需要的时间,包括在队列等待的时间,也包括磁盘控制器处理本次请求的有效时间 |
r_await | 每个读操作平均所需要的时间,不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间 |
w_await | 每个写操平均所需要的时间,不仅包括硬盘设备写操作的时间,也包括在队列中等待的时间 |
svctm | 表面看是每个IO请求的服务时间,不包括等待时间,但是实际上,这个指标已经废弃。实际上,iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间 |
%util | 表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有 |
备注:
%util 表示该设备有i/o非空闲的时间比率,不考虑i/o有多少,由于硬盘设备有并行处理多个i/o请求的能力,所以%util即使达到100%也不意味着设备饱和了。
svctm 一般要小于await(因为同时等待的请求的等待时间被重复计算了),svctm的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致svctm的增加。
await 的大小一般取决于服务时间(svctm)以及I/O队列的长度和I/O请求的发出模式
svctm 比较接近 await,说明I/O几乎没有等待时间;
await 远大于 svctm,说明I/O队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,md调整内核elevator算法,优化应用,或者升级CPU。