在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系统中的僵尸进程问题,确保系统的高效运行。