服务器CPU占用100%怎么排查?Linux top/htop实战诊断案例

服务器 CPU 突然跑满,网站响应变慢甚至无法访问,是运维中最常见的紧急情况之一。很多人遇到这种情况第一反应是重启服务器——但重启只是治标,不找到根因下次还会发生。本文通过真实案例,带你掌握 Linux 系统下 CPU 高占用的完整排查思路和工具使用。


一、紧急处置:先降低影响,再排查原因

当 CPU 跑满导致服务不可用时,第一步不是急于重启,而是:

  1. SSH 登录服务器(CPU 满载时 SSH 可能很慢,耐心等待)
  2. 立刻查看实时进程,找到消耗 CPU 最多的进程
  3. 判断是否可以临时 kill 该进程(业务进程 vs 恶意进程)
  4. 在服务恢复后,深入分析根因

二、第一步:用 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

常见高危信号:

  • 进程名是乱码、随机字母串(如 kworkerdsxmrig)→ 高度怀疑挖矿木马
  • PHP-FPM / Nginx / MySQL 占用异常高 → 业务流量问题或慢查询
  • Python / Node 进程占用高 → 代码逻辑问题(死循环、内存泄漏)

三、用 htop 获得更直观的视图

# 安装 htop(如未安装)
sudo apt install htop -y
htop

htop 的优势:

  • 每个 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.log

2. 查看 Nginx 访问日志,确认是否有异常高频请求:

# 统计访问最多的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

3. 如果是 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 秒的查询,以及 StateCopying to tmp tableSorting 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 中出现陌生进程名(如 kdevtmpfsixmrigsysupdate),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 漏洞等)
  • 重置所有账号密码,检查是否新增了系统用户
  • 如果情况严重,建议直接重装系统,从干净备份恢复数据

七、辅助排查工具速查

工具命令示例用途
stracestrace -p [PID]追踪进程系统调用,定位卡点
lsoflsof -p [PID]查看进程打开的文件和网络连接
iotopsudo iotop查看磁盘 I/O 高占用进程
netstatss -tnp查看网络连接,发现异常外联
dmesgdmesg | tail -30查看内核日志,排查 OOM 等系统事件

总结

服务器 CPU 100% 的排查遵循一个核心逻辑:定位进程 → 分析行为 → 找到根因 → 针对性解决。切忌直接重启,那只是把问题藏起来,下次还会复发。

如果你的服务器因配置不足而频繁出现 CPU 满载,可能是升级配置的时候了。后浪云香港云服务器支持随时在线升配,无需迁移数据,帮助你平滑应对业务增长带来的资源压力。

THE END