磁盘IO利用率高问题排查SOP

发布时间 2023-07-09 13:28:10作者: 涅槃的凤凰

对于业务开发来说,碰到磁盘IO利用率高的情况并不多,毕竟写磁盘的操作都集中到DB了,例如mysql/redis/hbase,一般由DBA来处理。但一些业务上的写文件、写日志,还是可能会碰到的。

步骤1:查看服务整体状态:top

从设备角度:
iostat 2 // 每2秒输出一次io使用情况

步骤2:找出占用IOPS大的进程

# -d表明显示磁盘IO,每1秒输出一次,输出20次
pidstat -d 1 20

步骤3:找出进程对应的线程

# -d表示磁盘IO,-t代表显示线程,-p代表进程ID,每1秒打印一次,共显示5次
pidstat -dt -p [pid] 1 5

步骤4:查看进程在做什么系统IO调用

# -p表示进程ID,-f表示同时追踪线程的系统调用(默认只追踪进程的)
strace -f -p [pid]

(这里也可以使用perf trace -t [tid] -o [output file name]来记录系统调用,使用cat [filename]来查看。


可以看出,有大量的open、write和close系统调用。write每次写入1048575字节。

步骤5:结合代码查看是否有问题

定位到具体的线程、以及线程在做什么之后,就可以结合代码来看了。

  • 对于mysql,可以结合线程ID,结合information_schema表,来查看是哪个SQL语句导致的
  • 对于java线程,可以结合jstack输出的Java线程ID和native线程ID,来找到对应的java线程ID