我们的系统如果遇到io问题和过多僵尸进程的排查思路
io问题
老规矩用top查看系统的进程,如果发现cpu很高但是user,sys,nic等指标不高,但是wa很高,说明可能存在了io问题
我们可以采用新的工具dstat,他可以同时查看cpu和io问题
1 |
|
图中所示,idl掉的时候都是read升高。于此我们判断io出现问题,通过perf和pidstat工具进一步排查
1 | # 间隔 1 秒输出多组数据 (这里是 20 组) |
看到app没次有32MB的数据的读取
然后同过perf top去查看代码
僵尸进程
首先通过top看进程状态我们常见的几种状态
- R:Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
- D:Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
- Z:是Zombie 的缩写,表示进程已经结束但是父进程还没有回收它
- S:是Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
- I:是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上,不会引起某些负载的升高。
- T:也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。
X:进程消亡,top不会出现。
我们系统应该尽量避免Z出现,Zombie是如何产生的?如果系统出现了大量的Zombie我们该如何排查?
产生原因
正常情况下,当一个进程创建了子进程后,它应该通过系统调用 wait() 或者 waitpid() 等待子进程结束,回收子进程的资源;而子进程在结束时,会向它的父进程发送 SIGCHLD 信号,所以,父进程还可以注册 SIGCHLD 信号的处理函数,异步回收资源。如果一个子进程被销毁父进程还没来得及对子进程进行回收就会出现Zombie。短暂的Zombie是没问题的,但是大量的Zombie进程我们就需要关注了。
排查思路
通过pstree查看僵尸进程的父进程,比如下面的4009进程,然后去查看4009的程序代码
1 |
|