服务器高 CPU 排查方法
适用于 Linux / 宝塔,不依赖具体进程名。
1. 定位进程(必做)
top # 实时看,按 P 按 CPU 排序
或
ps aux --sort=-%cpu | head -11
记录:进程名、PID、CPU%、运行用户、启动命令。
2. 看系统整体情况
uptime # 负载 load average
nproc # CPU 核心数(load 要除以核心数看是否过载)
free -h # 内存是否吃紧
vmstat 1 5 # si/so 高说明内存不够在 swap,CPU 也会虚高
3. 确认进程是否「正常」
完整命令行
ps -p <PID> -o pid,user,cmd
真实可执行文件路径
ls -l /proc/<PID>/exe
是否注册为系统服务
systemctl status <服务名>
可疑信号:
- 路径不在
/usr/bin、/usr/sbin等常规目录 - 没有对应 systemd 服务却在跑
- CPU 长期 100%+ 且无法解释
- 进程名模仿常见软件(fail2ban、sysupdate 等)
4. 按进程类型深入
| 类型 | 常用命令 |
|---|---|
| 任意进程 | strace -p <PID> -c(看系统调用,需 root) |
| Java | jstack <PID>、top -H -p <PID> |
| MySQL | SHOW FULL PROCESSLIST;、慢查询日志 |
| Nginx | access/error 日志、upstream 响应 |
| PHP | 网站日志、php-fpm 慢日志 |
| Redis | redis-cli slowlog get 20 |
5. 临时止血
优先优雅停止
systemctl stop <服务名>
kill -15 <PID>
无效再强制
kill -9 <PID>
确认
top
ps -p <PID>
6. 防止复活
crontab -l
cat /etc/crontab
ls /etc/cron.d/
systemctl list-units --type=service --state=running
grep -r "<关键词>" /etc/cron* /etc/systemd/ 2>/dev/null
kill 后观察 5~10 分钟,看进程是否再次出现。
7. 通用排查流程
CPU 高
→ top/ps 找 PID
→ 看 load、内存(uptime / free / vmstat)
→ 认进程、看路径、查是否系统服务
→ 业务进程:查日志 / 慢查询 / 线程栈
→ 未知/可疑进程:kill → 查 cron/systemd → 隔离文件
→ 确认 CPU 恢复且不再复发
8. 常用命令速查
top # 实时进程
ps aux --sort=-%cpu | head # CPU 排行
pgrep -af <名字> # 按名查进程(比 grep 干净)
lsof -p <PID> # 进程打开的文件/连接
netstat -tnp | grep <PID> # 进程网络连接(或 ss -tnp)
journalctl -u <服务> -n 100 # 服务日志
9. 预防
- 宝塔/云监控设 CPU 告警
- 定期看
ps aux --sort=-%cpu | head - 只开必要端口,改默认密码
- 业务服务单独看日志和慢查询
口诀:top 找 PID → 看路径和服务 → 业务查日志,陌生就 kill 并查 cron。