服务器CPU占用100%怎么排查?Linux top/htop实战诊断案例
服务器 CPU 突然跑满,网站响应变慢甚至无法访问,是运维中最常见的紧急情况之一。很多人遇到这种情况第一反应是重启服务器——但重启只是治标,不找到根因下次还会发生。本文通过真实案例,带你掌握 Linux 系统下 CPU 高占用的完整排查思路和工具使用。
一、紧急处置:先降低影响,再排查原因
当 CPU 跑满导致服务不可用时,第一步不是急于重启,而是:
- SSH 登录服务器(CPU 满载时 SSH 可能很慢,耐心等待)
- 立刻查看实时进程,找到消耗 CPU 最多的进程
- 判断是否可以临时 kill 该进程(业务进程 vs 恶意进程)
- 在服务恢复后,深入分析根因
二、第一步:用 top 快速定位高 CPU 进程
top进入 top 界面后,按 P 键按 CPU 使用率排序(默认已按此排序)。重点关注:
- 第一列
PID:进程 ID %CPU:CPU 占用率COMMAND:进程名称- 顶部
us(用户空间)和sy(内核空间)占比
典型输出示意:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 www-data 20 0 456789 87654 12345 R 98.7 4.3 12:34.56 php-fpm
5678 mysql 20 0 1234567 345678 23456 S 45.2 16.8 8:21.33 mysqld常见高危信号:
- 进程名是乱码、随机字母串(如
kworkerds、xmrig)→ 高度怀疑挖矿木马 - PHP-FPM / Nginx / MySQL 占用异常高 → 业务流量问题或慢查询
- Python / Node 进程占用高 → 代码逻辑问题(死循环、内存泄漏)
三、用 htop 获得更直观的视图
# 安装 htop(如未安装)
sudo apt install htop -y
htophtop 的优势:
- 每个 CPU 核心独立显示,一眼看出是单核满载还是全核满载
- 支持鼠标操作,可直接点击进程按 F9 发送信号(kill)
- 内存和 SWAP 使用情况一目了然
诊断技巧:如果只有 1 个 CPU 核心跑满,通常是单线程的业务代码问题(如 PHP 脚本死循环);如果所有核心都满载,可能是高并发流量、DDoS 或挖矿木马。
四、案例一:PHP-FPM 进程导致 CPU 满载
现象
top 显示多个 php-fpm 进程各占 20~30% CPU,合计超过 100%,网站响应超时。
排查步骤
1. 查看 PHP-FPM 慢日志,找出执行缓慢的脚本:
# 开启慢日志(在 php-fpm 配置中)
; request_slowlog_timeout = 5s
; slowlog = /var/log/php-fpm-slow.log
# 查看慢日志
tail -f /var/log/php-fpm-slow.log2. 查看 Nginx 访问日志,确认是否有异常高频请求:
# 统计访问最多的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -203. 如果是 WordPress 网站,常见原因:
- 未安装缓存插件,每个请求都触发数据库查询
- 被爬虫大量抓取
wp-login.php(暴力破解) - 某个插件存在性能问题(逐一停用排查)
解决方案
- 安装 Redis 缓存 + WP Super Cache,减少重复查询
- 在 Nginx 中限制
wp-login.php的访问频率 - 使用 Cloudflare Bot Fight Mode 拦截恶意爬虫
五、案例二:MySQL 慢查询导致 CPU 高
现象
mysqld 进程 CPU 占用持续超过 80%。
排查步骤
1. 进入 MySQL,查看当前正在执行的查询:
mysql -u root -p
SHOW FULL PROCESSLIST;重点关注 Time 列超过 10 秒的查询,以及 State 为 Copying to tmp table、Sorting result 的查询(通常表示缺少索引)。
2. 开启慢查询日志:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 超过2秒的查询记录
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';3. 分析慢查询日志:
sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow.log解决方案
- 为高频查询字段添加数据库索引(
EXPLAIN分析查询计划) - 引入 Redis 缓存热点数据,减少 MySQL 查询压力
- 升级服务器内存,增大 MySQL
innodb_buffer_pool_size
六、案例三:恶意挖矿木马(高危!)
现象
top 中出现陌生进程名(如 kdevtmpfsi、xmrig、sysupdate),CPU 持续跑满,且 kill 后会自动重启。
排查步骤
1. 查看可疑进程的详细信息:
ls -la /proc/[PID]/exe # 查看进程对应的可执行文件路径
cat /proc/[PID]/cmdline # 查看启动参数2. 检查定时任务(木马常用 crontab 实现持久化):
crontab -l
sudo crontab -l
cat /etc/cron.d/*
cat /var/spool/cron/crontabs/*3. 查找最近被修改的文件:
find /tmp /var/tmp /dev/shm -type f -newer /etc/passwd 2>/dev/null处置方案
- 立即删除可疑进程文件和定时任务
- 检查并修复入侵漏洞(弱密码、Redis 未授权访问、Web 漏洞等)
- 重置所有账号密码,检查是否新增了系统用户
- 如果情况严重,建议直接重装系统,从干净备份恢复数据
七、辅助排查工具速查
| 工具 | 命令示例 | 用途 |
|---|---|---|
| strace | strace -p [PID] | 追踪进程系统调用,定位卡点 |
| lsof | lsof -p [PID] | 查看进程打开的文件和网络连接 |
| iotop | sudo iotop | 查看磁盘 I/O 高占用进程 |
| netstat | ss -tnp | 查看网络连接,发现异常外联 |
| dmesg | dmesg | tail -30 | 查看内核日志,排查 OOM 等系统事件 |
总结
服务器 CPU 100% 的排查遵循一个核心逻辑:定位进程 → 分析行为 → 找到根因 → 针对性解决。切忌直接重启,那只是把问题藏起来,下次还会复发。
如果你的服务器因配置不足而频繁出现 CPU 满载,可能是升级配置的时候了。后浪云香港云服务器支持随时在线升配,无需迁移数据,帮助你平滑应对业务增长带来的资源压力。
