先说:磁盘性能指标
先简单描述下常用的磁盘性能指标,用来指导iowait问题分析定位
指标 | 描述 |
---|---|
每秒 I/O 数 | 一次磁盘的连续读或者连续写称为一次磁盘 I/O, 磁盘的 IOPS =每秒磁盘连续读次数+每秒磁盘连续写次数。传输小块不连续数据时,参考该指标进行衡量 |
吞吐量 | 硬盘传输数据流的速度,传输数据速度=读出数据+写入数据。传输大块不连续数据的数据,参考该指标进行衡量 |
平均 I/O 数据尺寸 | 为吞吐量除以 I/O 数目,该指标对揭示磁盘使用模式有重要意义。数据尺寸小于 32K,可认为磁盘使用模式以随机存取为主;反之,可认为磁盘使用模式以顺序存取为主。 |
磁盘活动时间百分比 | 即磁盘利用率。如果磁盘利用率超过 70%,应用进程将花费较长的时间等待 I/O完成,因为绝大多数进程在等待过程中将被阻塞或休眠。 |
服务时间 | 指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/mem的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过 20ms,一般可考虑会对上层应用产生影响。 |
I/O 等待队列长度 | 指待处理的 I/O 请求的数目,如果 I/O 请求压力持续超出磁盘处理能力,该值将增加。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的I/O 等待队列长度 |
等待时间 | 指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果 I/O 请求持续超出磁盘处理能力,意味着来不及处理的 I/O 请求不得不在队列中等待较长时间。 |
再说:iowait?
是系统因为io导致的进程wait。系统在做io,导致没有进程在干活,cpu在执行idle进程空转。
所以iowait的产生要满足两个条件:
- 进程在等待io
- 等待io时没有进程可运行
iowait实际测量的是cpu时间
- iowait = (cpu idle time)/(all cpu time)
确认并跟踪问题
linux常用命令中有很多都具备该选项:top、sar、vmstat、mpstat、dstat等等
- 查找哪块磁盘正在被写入
iostat
命令详解可以参考 linux命令—iostat - 查找引起高I/O wait 对应的进程
iotop
命令详解可参考 linux命令—iotop - 查找哪个文件引起的I/Owait
lsof -p pid
命令详解可参考 linux命令—lsof
lsof 命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程 - pt-ioprofile定位负载来源文件(完全可以替代3)
pt-ioprofile的原理是对某个pid附加一个strace进程进行IO分析
默认参数下该工具展示的是IO占用的时间
[root@db25440 ~]# pt-ioprofile -p=25129
Thu May 17 18:48:35 CST 2018
Tracing process ID 25129
total pwrite write fsync fdatasync open filename
11.709016 0.000000 2.634413 0.000000 9.074603 0.000000 /my/log/mysql-bin.001200
9.093400 2.966219 0.000000 6.127181 0.000000 0.000000 /my/base/ib_logfile3
0.000419 0.000000 0.000000 0.000000 0.000000 0.000419 /dev/urandom
[root@db25440 ~]#
对于定位问题更有用的是通过IO的吞吐量来进行定位。使用参数 –cell=sizes,该参数将结果已 B/s 的方式展示出来
[root@db25440 ~]# pt-ioprofile -p=25129 -c=sizes
Thu May 17 18:49:25 CST 2018
Tracing process ID 25129
total pwrite write fsync fdatasync open filename
40917504 40917504 0 0 0 0 /my/base/ib_logfile3
14300748 0 14300748 0 0 0 /my/log/mysql-bin.001200
0 0 0 0 0 0 /dev/urandom
[root@db25440 ~]#
如果正常运行iowait并不高,突然间高了,可能是系统访问量大了,最大的可能是磁盘满了~
当I/O等待时间所占CPU时间的比重很高时,首先检查机器是否正在大量使用交换空间,因为硬盘操作的速度远远低于RAM,所以当系统内存耗尽,开始使用交换空间的时候,系统的性能会受到严重影响。任何想要访问硬盘的操作都要完成与硬盘的I/O交换。所以,故障排除的第一步是看内存是否耗尽,如果是,先解决这个问题。如果还有大量可用的RAM,需要明确哪个进程占用了大部分I/O操作。
iowait高并不一定反应出磁盘存在瓶颈
高速cpu会造成很高的iowait值,但这并不代表磁盘是系统的瓶颈。唯一能说明磁盘是系统瓶颈的方法,就是很高的read/write时间,一般来说超过20ms(这个具体计算一下~linux命令—iostat),就代表了不太正常的磁盘性能。