定位iowait问题

先说:磁盘性能指标

先简单描述下常用的磁盘性能指标,用来指导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等等

  1. 查找哪块磁盘正在被写入
    iostat
    命令详解可以参考 linux命令—iostat
  2. 查找引起高I/O wait 对应的进程
    iotop
    命令详解可参考 linux命令—iotop
  3. 查找哪个文件引起的I/Owait
    lsof -p pid
    命令详解可参考 linux命令—lsof
    lsof 命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程
  4. 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),就代表了不太正常的磁盘性能。

猜你喜欢

转载自blog.csdn.net/yue530tomtom/article/details/80284825