在CentOS系统中,僵尸进程是一个常见的问题,它们会消耗系统资源并可能导致系统性能下降。以下是一个关于CentOS僵尸进程的案例分析。
案例背景
某项目的开发环境部署在单台虚拟机上,安装了MongoDB集群用于测试。环境包括1个mongos进程和3个config服务器以及3个shard(每个shard有3个副本),总计7个MongoDB实例。MongoDB版本为4.2.19,操作系统为CentOS 7.9。
问题描述
在测试结束后,发现虚拟机的CPU负载一直维持在50%左右,而MongoDB的QPS已经降为0。关闭所有MongoDB实例后,CPU负载立即恢复正常;重新开启MongoDB实例后,CPU负载再次飙升。通过执行top
命令发现,虽然CPU的usr使用率达到了40%,但前几个进程的%cpu加起来远远不够数。使用dstat
查看整体负载,发现除了CPU负载不正常外,其他指标均正常。
问题诊断
为了找出频繁短时进程偷走CPU资源的原因,使用了perf record -ag -- sleep 10 && perf report
命令查看CPU执行情况,发现大量与MongoDB相关的调用。但API命名不直观,无法猜测对应的执行逻辑。
进一步使用sar -w 1
命令查看每秒生成的进程数,发现平均每秒新建80多个进程。为了抓出频繁建立短时进程的应用,使用了execsnoop
工具通过ftrace实时监控进程的exec()行为,并输出短时进程的基本信息,包括进程PID/PPID、命令行参数。
问题解决
通过execsnoop
监控发现,zabbix_server
进程频繁创建新进程并对MongoDB进行操作,导致CPU负载过高。关闭zabbix_server
进程后,CPU负载立即恢复正常,找到了问题的元凶。
小结
当机器CPU负载持续高涨却抓取不到top进程时,可以采用execsnoop
抓取短时进程。类似工具还有iosnoop
和opensnoop
。
僵尸进程的管理
- 查找僵尸进程:使用命令
ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]'
可以查找系统中的僵尸进程。状态为Z或z的进程表示它们是僵尸进程。 - 批量干掉僵尸进程:可以使用以下命令批量杀死僵尸进程:
ps -A -o stat,ppid,pid,cmd | grep -e '[Zz]' | awk '{print $2}' | xargs kill -9
- 注意事项:在杀死僵尸进程时,如果直接杀死僵尸进程无效,需要杀死其父进程,因为子进程的僵尸状态依赖于其父进程。
通过上述方法,可以有效地管理和解决CentOS系统中的僵尸进程问题,确保系统的高效运行。