一、进程的状态
1. 查看进程状态: ps 命令的STAT字段, top命令的S字段
2. 进程状态说明:
R:正在运行或等待运行
D:正在跟硬件交互,不允许被其他进程或中断打断
Z:僵尸进程,自身已结束但父进程没有回收资源
S:可中断睡眠状态,等待被唤醒
I:内核线程的空闲状态,不可中断
二、判断僵尸进程是否对系统造成了影响
执行top命令
(1) 第一行的平均负载(Load Average),分别是过去的1,、5、15分数的复杂,表明复杂正在增加,并且以到达CPU数(2)。
(2) 第二行的tasks,已经确认有115 zombie
(3) 用户CPU(us)和系统CPU(sy)都不高,但iowait(wa)很高,说明有问题。
(4) 有两个进程处于D状态,所以确认有僵尸进程已经对系统造成影响。
三、找出僵尸进程影响性能的具体代码
(不是所有僵尸进程都必然影响性能,要证明)
1. 使用dstat 命令,观察 CPU 和 I/O 的使用情况
每当 iowait 升高(wai)时,磁盘的读请求(read)都会很大。这说明 iowait 的升高很可能就是磁盘读导致。
2. 使用 pidstat 命令,查看进程读写数据量 (查看所有: pidstat -d 1 20, 查看具体某个进程:pidstat -d -p 4344 1 3)
确认就是读数据的问题。
3. 使用 strace 查看系统调用堆栈
因为僵尸进程无法查看系统调用,所以这个方法不行,要换一个办法。
4. 使用 perf 查看系统调用
先 perf record -g 执行15秒,然后ctrl + c,再执行 perf report
得到具体的函数,然后去程序处修改就行了
四、小结
1. top 确定是否有僵尸进程, iowait(wa) 数值是不是过高
2. dstat 查看 read write是不是很大
3. pidstat 查看是哪个进程读写很大
4. strace 查看非僵尸进程的调用堆栈
5. perf 查看僵尸进程的系统调用