简介
iostat命令用于监视系统输入/输出设备的加载情况,方法是观察设备的活动时间与其平均值的关系转移率。iostat命令生成报告,可用于更改系统配置,以便更好地平衡输入/输出负载物理磁盘。
目录
1. 语法
iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
1.1. 常用参数
-c:显示CPU利用率
-d:显示设备利用率
-t:显示时间戳
-x:显示详细磁盘指标
-y:跳过第一条数据
-k:显示单位为KB
-m:显示单位为MB
-p:指定主设备,显示主设备下所有磁盘信息
2. 详细用法
- 注意:iostat 命令第一次输出数据不准确,需要指定 -y 跳过第一条输出
2.1. 监控CPU利用率
iostat -c 1 3 # 输出3次,每次间隔1秒
%user :用户空间占用的CPU
%nice :改变过优先级进程占用的CPU
%system:内核空间占用的CPU
%iowait:CPU 等待 IO 的占比(若该占比较高,硬盘可能存在 I/O 瓶颈)
%steal :管理程序(hypervisor)为另一个虚拟进程提供服务而等待的虚拟CPU占比
%idle :空闲的CPU(若空闲较大,但系统响应慢,有可能CPU等待内存分配,应适当增加内存容量;若空闲持续低于 1%,则系统的CPU处理能力较低)
2.2. 监控TPS磁盘读写
iostat -d 1 3 # 输出3次,每次间隔1秒
Device :设备名
tps :每秒 I/O 数(连续读写之和)
kB_read/s:每秒从设备读取的数据(单位:KB)
kB_wrtn/s:每秒从设备写入的数据(单位:KB)
kB_read :读取的总数据量(单位:KB)
kB_wrtn :写入的总数据量(单位:KB)
2.3. 监控磁盘利用率
iostat -dx 1 3 # 输出3次,每次间隔1秒
Device :磁盘名
rrqm/s :每秒进行的 merge 读数目
wrqm/s :每秒进行的 merge 写数目
r/s :每秒读 I/O 次数
w/s :每秒写 I/O 次数
rkB/s :每秒读设备的字节数(单位:K字节)
wkB/s :每秒写设备的字节数(单位:K字节)
avgrq-sz:平均每次设备I/O操作的数据大小
avgqu-sz:平均I/O队列长度
r_await :每个读操作的平均所需时间(包含列队等待时间)
w_await :每个写操作的平均所需时间(包含列队等待时间)
await :平均每次设备 IO 操作的等待时间(平均响应时间不超过5ms,单位:ms)
svctm :平均每次设备 IO 操作的服务时间(单位:ms)
%util :磁盘繁忙程度(注意:每块磁盘后面都有表示是否繁忙)
如果 svctm 与 await 比较接近,说明 IO 几乎没有等待。
如果 await 远高于 svctm ,说明 IO 队列太长 响应太慢,需要优化,可以从 avgqu-sz 队列长度看出来。
2.4. 指定某块磁盘
只需要在参数或者命令后面指定设备即可
iostat /dev/sda2 1 3
iostat 1 3 /dev/sda2
iostat -tx /dev/sda2
2.5. 指定输出单位
指定单位KB(-k)
指定单位MB(-m)
2.6. 常见组合用法
同时查看CPU和磁盘读写(输出时间,不输出第一次无意义的信息)
iostat -cdty 1 3 # c指定CPU,d指定磁盘,t每次输出时间,y跳过第一次无意义的数据
输出CPU和磁盘利用率(输出时间,不输出第一次无意义的信息)
iostat -xty 1 3 # x指定磁盘利用率,t每次输出时间,y跳过第一次无意义的数据
指定一块磁盘,查看磁盘读写(输出时间,不输出第一次无意义的信息)
iostat -dty /dev/sda1 1 3 # d执行磁盘读写,t每次输出时间,y跳过第一次无意义的数据
3. 应用场景
3.1. 判断cpu瓶颈
iostat可以通过整体cpu使用情况来粗略的判断一下是否存在瓶颈
iostat -ct 1
- -c:监控cpu
- -t:输出时间
第1次的监控信息是之前的平均信息,所以对当前来说并不准确,使用 -y 跳过
- 上述可以看到 idle 为0,表示没有可用的cpu资源,前面 user 占用84.1%,system 占用15.9%,从比例上来看是正常的。在生产环境中,我们一般把cpu总占用率控制在 70% 以下,如果是生成环境出现了 idle 低于 30%,那么需要排除进程,通过其他命令 top 或 pidstat 查看。
- 如果 idle 接近0,iowait 使用过多,那么就是磁盘出现了瓶颈,使用 iostat -dx 来查看总的磁盘利用率,读写速度等情况,再使用 pistat 检查出现磁盘瓶颈的进程。
- 如果 system 接近 user,那么系统态调用过多,这可能是程序代码不规范导致的,需要检查代码。
top 命令见其他文章:https://blog.csdn.net/m0_61066945/article/details/126452494
pidstat 命令见其他文章:https://blog.csdn.net/m0_61066945/article/details/126568206
3.2. 判断io瓶颈
iostat 命令的主要作用就是用来判断磁盘瓶颈,来看一个例子
iostat -xy 1
来看几个关键信息:
- user 达到 67.6%
- system 达到 22%
- iowait 达到 10.3%
- idle 为0
- util 达到 85%
从 cpu 的调度情况来看,已经没有了可用的cpu资源,这里可以断定cpu已经达到极限。从 util 来看,程序的业务偏向于 I/O 密集型,对磁盘使用率很高,如果中途出现其他业务争抢资源,那么可能导致性能下降更加严重。
那么什么情况下磁盘才达到瓶颈呢?见下图
可以看到 iowait 达到 44.3%,这已经很高了。再看 ulit 达到 106%,实际上这个命令对磁盘利用率的计算不是很准确,但大致接近,所以可以断定磁盘利用率已经达到了瓶颈。一些程序在做某些操作时,磁盘利用率会很高,但时间不会太长;但如果磁盘利用率一直达到饱和状态,那么可能程序真的出现了I/O瓶颈,这需要优化程序。
除了通过磁盘利用率来观察,还有一种直接的方法,就是测试硬盘的读写性能,看正常情况下硬盘的读写速度能到达多大,然后对比磁盘读写速率即可