作者:布丁缘 https://www.ddkiss.com/archives/68.html
Linux 有很多运维诊断工具,有些用起来很简单,有些功能很强大用起来就有些麻烦。比如I/O等待问题,原因可能有很多种,也很难用某一种工具就能定位。特别是如何找到到底是哪个进程读写了哪个文件引起的?
最近,从监控上看总是在上午10点左右I/O负载突然就升起来了,连远程SSH都卡住。因为ECS服务器内存有限,我启用了SWAP,内存不足时不至于会崩溃,系统性能肯定有所下降。
说明:在Centos7中,top ps
等是系统自带的工具,iostat iotop lsof
等都是需要自行安装的。
确实系统负载上升是否由于I/O异常导致
最简单的是用top
命令,比如
1 |
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie |
其中wa
也就是iowait
参数所表示的,有多少比例的CPU在等待I/O
找到具体读写的是哪个磁盘
最简单的是iostat
命令,比如
1 |
$ iostat -x 2 5 |
其中-x
知指明输出更加详细的信息。2 5
表示间隔2秒统计一次总共输出5次。第一行结果是自系统启动以来的统计值,通常排查突发的I/O异常时可忽略。重点看%util
列,表示进程使用I/O的比例。
找出引起高I/O的进程
最简单的是iotop
命令,比如
1 |
Total DISK READ: 404.95 K/s | Total DISK WRITE: 9.91 M/s |
iotop
命令确实是一个很好用的工具,但是很多Linux发行版中默认并没有安装。如果系统里没有这个命令,又不想安装时,怎么办?有没有更简单的方式?
能够实现iotop
类型功能的ps
命令
首先看下进程状态编码
1 |
PROCESS STATE CODES |
注意到,如果进程正在等待I/O,进行的状态码经常为D
。通过这个信息,我们可以大概估算出哪些进程在I/O等待中,比如
1 |
[root@myos ~]# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done |
这里就发现进行 27456 可能有问题。但等待I/O也不一定说明它在疯狂读写磁盘。为了确定它确实读写很多,可以用/proc
目录下的信息来定位,比如
1 |
[root@myos ~]# cat /proc/27456/io |
需要注意的是,不同的线程参考值不一样。这个得具体问题具体分析。