在运维过程中,我们经常会碰到机器由于某几个特殊的僵尸进程造成整台服务器上的进程异常卡死,负载变高。
例如以下:
其中,存在8个僵尸进程,并且进程19712的CPU使用异常。查看具体的僵尸进程有哪些:
发现这些子僵尸进程的父进程即为19712进程。其对应的其实就是namenode进程
解决办法:
(1)如果业务不繁忙,允许停机,可以使用重启机器来解决(这种方法不行,业务不能停)
(2)杀掉父进程(由于是namenode进程,如果是HA模式,杀掉后会切换到另个nn节点)(未采取,我们找的是根本原因)
kill -9 父进程号 //注意:如果这个父进程号是init进程,杀掉它,整个系统就挂了
对于此种方法,虽然能暂时解决本台机器上的僵尸进程,如果没有找到致使僵尸进程的根本原因,就算切到了另个nn节点,另个nn节点也会出现僵尸异常进程的。
(3)将筛选到的僵尸子进程进行挂起(未采取,但其他情况可以使用)
kill -HUP 进程pid //将子进程挂起后,相当于什么也不做了
最终的解决办法:
根据主机上19712进程即namenode进程的日志,发现日志中大量报错"无此用户",根据报错,手动在两个nn节点上创建所有所需的用户后,僵尸进程立马全部消失,并且主机负载全部恢复了正常。
对于其他情况的进程,大家可以参考上面提供的3个方法进行解决,如果能找到根本的致病原因,那就更好了。
常用命令总结:
top //查看里面的zombie对应的进程有多少个
ps -e -o ppid,stat | grep Z | cut -d " " -f2 | wc -l //统计僵尸进程的个数
ps -ef | grep "defunct" //可以看到僵尸进程的父进程号
如果要杀掉僵尸进程,需要杀掉它的父进程号,命令为:
kill -9 父进程号 //注意:如果这个父进程号是init进程,杀掉它,整个系统就挂了,所以考虑使用下面这个命令
kill -HUP 进程pid //将筛选到的子进程挂起
参考网址:
https://jingyan.baidu.com/article/3d69c5514d12bcf0ce02d77b.html