Linux进程占用100%CPU排查
服务器CPU长期处于100%时,网站会变慢甚至宕机。
很多新手遇到这种情况会慌,其实只要按下面几步操作,就能快速找到是哪个进程在吃CPU,以及它正不正常。
准备工作:确保你能登录并观察到系统状态
你需要能通过SSH连接到服务器,并且拥有root权限或至少能使用sudo。
常用Linux发行版(CentOS、Ubuntu、Debian)都自带top和ps命令,基础排查不需要额外安装。
如果喜欢更直观的界面,可以先用包管理器安装htop(yum install -y htop或apt install -y htop),但后面步骤仍以更通用的top为例。
第一步:用top命令一秒找到CPU高峰元凶
登录后直接输入top,回车。
你会看到一个实时刷新的进程列表。
默认是按CPU使用率排序的,但为了保险,按一下键盘上的大写P(Shift+P)确保按%CPU从高到低排序。
列表中第一行显示总CPU和内存使用率,下面的进程列表里,最上面那个就是CPU占用最高的进程。
记下它的PID(第一列的数字)。
如果看到某个进程CPU占用超过90%甚至100%,那就找对了。
如果列表中有多个进程CPU都很高,可能需要逐一分析。
按q退出top。
第二步:用ps命令获取进程详细信息
知道PID后,用下面命令查看这个进程的完整命令行、用户、启动时间等信息,帮助判断它是不是正常的业务进程:
ps -p PID -o pid,ppid,user,%cpu,etime,args
将PID替换成你记下的数字。
输出会显示:
- 用户(user):如果是root或www-data,可能是系统服务或网站进程;如果是随机名称(如nobody或陌生字母),要警惕。
- 运行时间(etime):如果刚刚启动几秒但CPU就满了,很可能是异常进程。
- 命令行(args):如果是
/usr/sbin/httpd或java -jar app.jar,大概率是正常业务;如果是/tmp/...或./...且文件名很奇怪,多半是中招了。
如果想进一步看进程打开了哪些网络连接,可以加上lsof -p PID(需要安装lsof),重点检查有没有连接到外网的陌生IP,很多挖矿病毒会外联矿池。
第三步:判断进程性质并决定处理方式
正常业务进程(如Nginx、MySQL、Python应用)
如果CPU高是因为高峰期流量大,可以先检查是否有必要扩容,或者优化代码。
临时应对可以使用renice -n 19 -p PID降低进程优先级,或者用cpulimit -p PID -l 50限制CPU使用率不超过50%。
但不建议长期使用,最好从根源解决。
异常进程(挖矿、后门、可疑脚本)
如果进程名可疑(如kswapd0、xmr、sshd的伪装名),或者路径不在标准系统目录,基本可以判定是恶意软件。
先执行kill -15 PID尝试优雅终止,如果不行再kill -9 PID强行杀掉。
之后务必删除该进程的启动文件,并检查crontab(crontab -l)、/etc/rc.local、/etc/systemd/system/等位置是否有定时启动项。
避坑指南:做这些检查前不要冲动
- 不要看到CPU高就直接重启服务器。先找到进程再决定操作,盲目重启可能导致恶意进程随系统自启,问题依旧。
- 不要直接kill所有高CPU进程。例如mysqld在大量查询时CPU高是正常的,杀掉会导致数据库崩溃。先确认身份。
- 注意观察top输出中的WAIT或iowait,如果CPU高但进程列表里没有明显占用,可能是磁盘I/O瓶颈(
iostat -x 1可查看)。 - 有些挖矿进程会使用类似系统进程名的伪装,例如
sysuptime冒充系统进程,要用ps -ef仔细看参数。
效果验证:确认CPU恢复并检查残留
处理完成后再次运行top,应该看到%CPU总和使用率下降,之前异常进程不复存在。
如果依然很高,排错可能遗漏了其他进程,或者恶意程序有守护进程重生。
运行pstree -a可以查看进程树,看看有没有隐藏的子进程。
最后建议用netstat -antp | grep ESTABLISHED检查外联连接是否正常。
完成以上步骤后,你的CPU应该恢复正常。
如果你在处理Linux进程占用100%CPU排查时遇到本文没覆盖到的特殊情况,欢迎在评论区补充,我会继续帮大家补充手段。