服务器CPU 100%怎么排查?从入门到解决的全流程教程
服务器突然卡顿到几乎连不上,CPU 占用率达到 100% —— 这是很多建站新手都会遇到的头疼问题。
别慌,这篇文章会带你一步一步检查异常来源,并给出可执行的处理方法。
先看这一刻到底是谁在吃 CPU
登录服务器(通过 SSH 或宝塔面板的终端),在命令行里输入下面这个命令:
top
按一下 1 键,可以看到每个 CPU 核心的使用情况。
重点关注 %CPU 那一列排在最上面的进程。
如果某个进程的 CPU 占用持续超过 80%,基本就是它导致的。
有些系统默认没装 htop,效果更直观:
htop
按 F6 可以按 CPU 排序,用方向键选中进程后按 F9 可以直接结束(kill)。
小技巧:如果 top 里看到很多个同样的进程(比如 php-fpm、java、python),说明可能是并发请求过多或某些服务挂了。
进一步确认进程背后的身份
光看进程名还不够,你需要知道这个可执行文件在哪、是谁启动的。
执行:
ps -aux --sort=-%cpu | head -20
这条命令会列出 CPU 占用前 20 的进程详情,包括启动用户、CPU 使用率、内存和启动命令。
如果发现是 /usr/bin/php 运行了一个可疑的脚本,或者 ./xmrig 这种典型挖矿进程,那基本可以确定是恶意程序或资源被滥用。
对于可疑进程,先用 kill -9 进程PID 杀掉,然后检查 cron 定时任务:
crontab -l
cat /etc/crontab
把里面你不认识的任务先注释掉。
常见的 CPU 100% 原因与解法
场景一:PHP-FPM 进程过多(网站访问量大或慢查询)
如果 top 里看到大量 php-fpm 进程,每个占用的 CPU 并不高但总数很多,说明并发超过预期。
解决:
- 登录宝塔面板 -> 软件商店 -> PHP -> 设置 -> 性能调整,降低
pm.max_children(比如从 50 降到 20)。 - 或者临时在命令行手动重启 php-fpm:
systemctl restart php-fpm
场景二:MySQL 进程长期占用高 CPU
执行:
mysqladmin processlist -u root -p
或者登陆 MySQL 后执行 SHOW FULL PROCESSLIST;,看是否有大量 Query 状态或者 Copying to tmp table。
常见解法:
- 开启慢查询日志,找到重复的慢 SQL,加上索引。
- 减少不必要的数据库连接数,比如在程序里启用连接池。
场景三:被挖矿木马入侵
如果发现 crontab 里有多条非自己创建的定时任务,且进程名类似 xmrig、minerd、kworker(伪装名),请立即:
- 杀掉进程
- 删除定时任务
- 检查
/tmp、/var/tmp、/dev/shm下的可疑文件并删除 - 修改服务器密码、SSH 端口
- 如果没装安全软件,建议安装 CloudLinux 或 Wordfence(如果是 WordPress)
避坑提醒(新手容易踩的点)
- 不要直接重启服务器:重启后 CPU 会短暂降下来,但进程重新启动后又会 100%,且重启可能让正在写入的数据丢失。
- 不要随意 kill systemd 或其他系统进程:如果杀掉 sshd、systemd 等核心进程,会导致服务器无法连接。
- 宝塔面板里不要同时开启过多额外服务:比如在同一台小内存服务器上开 Nginx、Apache、MySQL、PHP 多个版本,CPU 和内存互相抢占。
- 云服务器 1 核 1G 配置跑 WordPress + WooCommerce?CPU 很容易 100%,建议升级配置或启用静态缓存。
如何验证问题已经解决
杀掉异常进程或调整配置后,观察 5-10 分钟:
top -bn1 | grep Cpu
如果 %us(用户态)和 %sy(系统态)加起来降到 30% 以下,说明恢复正常。
同时访问网站首页,看打开速度是否恢复到 1-3 秒内。
如果还是慢,继续用 top 检查,看看是不是另一个进程接力导致了 100%。
最后,建议在服务器上装一个简单的监控工具,比如 netdata 或宝塔的资源监控,这样下次 CPU 飙高时可以看回放,知道是哪个时间点哪个进程搞的鬼。
---
如果你正在处理服务器 CPU 100%,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。