服务器CPU突然飙升至100%?排查思路和解决方案全攻略
服务器CPU突然飙升至100%?排查思路和解决方案全攻略
最近看到有朋友在抱怨自己的小鸡(VPS)CPU突然爆满,直接冲到了100%,整个人都麻了。这种突发状况如果处理不及时,轻则业务卡顿,重则被服务商停机。
其实,CPU 100% 这种问题,虽然看着吓人,但只要掌握了一套标准的排查流程,大多都能在几分钟内找到真凶。今天就来详细聊聊当你的服务器“高烧”不退时,该如何一步步对症下药。
第一步:别慌,先看谁在吃资源
当你觉得服务器变卡,第一反应应该是连上终端(SSH),先确认一下是不是真的 CPU 飙高了。
常用命令:
最经典的就是 top 命令。直接输入 top,你会看到一个实时的资源占用列表。
Linux 下经典的 top 命令界面,可用于实时查看系统资源占用和进程列表。
- 看整体: 关注
%Cpu(s)这一行。如果是us(用户进程)高,多半是业务程序或挖矿病毒;如果是sy(系统内核)高,可能是驱动或IO问题;如果是wa(等待IO)高,那大概率是硬盘读写太慢拖累了CPU。 - 看个体: 在下面的进程列表中,按
P(大写)默认按CPU使用率排序。这时候排在第一位的那个家伙,大概率就是罪魁祸首。
如果你觉得 top 看起来眼花缭乱,可以用 htop。如果没装,一行搞定:
apt install htop # Debian/Ubuntu
yum install htop # CentOS
``n`htop` 界面更友好,支持鼠标操作,红红绿绿的一目了然,能让你迅速锁定“吃鸡”大户。
## 第二步:揪出进程的真实身份

*htop 提供了比 top 更友好的彩色界面,支持鼠标交互,能更直观地锁定高耗资源的进程。*
找到了占用最高的 PID(进程ID),接下来就要看它到底是干嘛的。
**查看详细信息:**
```bash
ps -fp PID
这个命令能把进程的完整路径、启动时间、启动用户都显示出来。
- 如果是正经业务: 比如是你自己跑的 Python 脚本、MySQL 数据库或者 Nginx,那可能是业务量突然增大,或者代码出现了死循环。
- 如果是陌生名字: 如果进程名是
kdevtmpfsi、xmrig这种,或者路径藏在/tmp、/var/tmp下的莫名其妙的长串随机字符目录,那基本就是中了挖矿木马。
第三步:常见的几种“发烧”原因分析
根据经验,CPU 100% 通常逃不出以下几种情况,大家可以对号入座:
使用 ps -fp PID 命令查看进程的完整路径、启动用户及时间等详细信息。
1. 挖矿病毒入侵
这是目前最常见的原因,尤其是那些密码简单、或者暴露在公网且没有做安全加固的服务器。
- 特征: 系统极卡,CPU 长期 100%,可能还会伴随着向外发送大量网络包。
- 解决: 直接
kill掉进程,然后删掉对应的恶意脚本文件。更重要的是查杀入侵源头(比如弱口令、Redis 未授权访问等),修改所有密码,安装杀毒软件(如 clamav)扫描一遍,或者直接重装系统(最彻底)。
2. 数据库查询慢查询或死锁
如果你跑的是 Web 网站,MySQL 突然 CPU 飙高是很常见的。
- 特征: 进程名通常是
mysqld。 - 解决: 登录数据库,执行
show full processlist;。看是否有大量状态为Sending data、Copying to tmp table或者Locked的查询。优化你的 SQL 语句,添加必要的索引。
3. 业务代码死循环或内存溢出
如果你自己写的程序,可能会因为 Bug 进入死循环,或者 OOM(Out of Memory)导致系统疯狂交换数据。
- 解决: 检查应用日志(Application Log),使用
strace -cp PID查看进程到底在系统调用层面干什么。如果是死循环,只能改代码重启服务。
4. 系统后台任务
有时候是系统自己的定时任务在运行,比如日志打包、备份数据库,或者是 updatedb(建立文件索引)。
- 特征: 这种通常是间歇性的,过一段时间就会自己降下来。
第四步:除了杀进程,还能做什么?
找到了问题进程,直接 kill -9 PID 是最快的方法,但治标不治本。
在 MySQL 中执行 show full processlist; 查看当前线程状态,排查慢查询或死锁。
- 限制资源使用: 如果你不想彻底关掉某个进程,但又怕它乱吃资源,可以用
cpulimit工具限制它的 CPU 使用率。比如限制某个进程最高只能用 50% 的 CPU:cpulimit -l 50 -p PID - 开机自启排查: 用
systemctl list-unit-files检查是否有不认识的服务被设为了开机自启。检查crontab -l,看看定时任务里有没有被写入恶意脚本。 - 防火墙加固: 既然 CPU 满载可能是由于入侵导致的,不如顺便检查一下防火墙规则。只开放必要的端口(如 80, 443, 22),其他的一律封死。
总结
遇到 CPU 100% 并不可怕,可怕的是不知道哪里出了问题。养成定期监控的习惯,装个像 NodeQuery、ServerStatus 之类的监控面板,设置报警阈值,一旦异常就能第一时间收到通知。
希望这篇排查思路能帮到你。如果你在操作过程中遇到了其他奇怪的现象,或者有更好的排查工具推荐,欢迎在评论区交流!
评论已关闭