
服务器 CPU 持续 100% 是站长最常遇到的故障之一,轻则网站卡顿、响应缓慢,重则直接 502、无法访问。很多新手遇到这种情况只会盲目重启,其实只要按标准化流程排查,绝大多数问题都能快速定位并解决。
本文以 Linux + 宝塔面板环境为例,整理一套完整的 CPU 占用过高排查思路,从进程、服务、程序、日志四个维度入手,新手也能一步步照做。
一、第一步:先看谁在占用 CPU
登录服务器,直接执行:
top
按下 Shift + P 按 CPU 使用率排序。
重点观察几类进程:
1、php-fpm:网站程序死循环、死锁、暴力爬虫
2、mysqld:慢查询、无索引 SQL、大量并发查询
3、nginx:CC 攻击、恶意请求刷屏
4、异常不知名进程:挖矿木马、恶意脚本
5、python / node / java 等其他业务进程
记下 CPU 最高的进程名 + PID,继续下一步。
二、第二步:判断是正常业务还是异常攻击
1. 如果是 php-fpm 占满
常见原因:
页面死循环、递归出错
插件 / 主题代码质量差
大量爬虫疯狂刷新
文件读取、图片处理逻辑过重
排查命令:
ps -ef | grep php-fpm
看进程数量是否异常暴增。
2. 如果是 mysqld 占满
典型表现:CPU 高、负载高、IO 不高。
执行:
mysqladmin processlist
或进入宝塔 → 数据库 → 慢查询日志,查看是否有长期执行的 SQL。
3. 如果是不明程序
名字类似:kdevtmpfsi、xmrig、sysupdate、upd 等
基本可以判定为挖矿木马,直接参考之前的挖矿清理文章处理。
三、第三步:定位具体网站与具体页面
一台服务器通常多个站点,需要定位到具体是哪个网站导致的。
1、查看 PHP 进程对应的请求日志
cd /www/wwwlogs/ tail -f *.log
看哪个域名在疯狂产生请求。
2、查看 Nginx 访问日志
tail -n 1000 /www/wwwlogs/你的域名.log | awk '{print $1,$7}' | sort | uniq -c | sort -nr能直接看到:
哪个 IP 在刷
刷的哪个页面
刷了多少次
如果是同一个 IP 高频请求,基本就是 CC 攻击或恶意爬虫。
四、第四步:检查是否被 CC 攻击或爬虫刷站
特征:
大量不同 IP,但访问同一个接口
同一 IP 短时间内大量请求
访问频率远超正常用户
处理方式:
宝塔安全 → 防火墙 → 开启 CC 防护
限制单 IP 访问频率
屏蔽异常 IP 段
开启 Nginx 限流模块
五、第五步:代码层面排查(程序死循环)
如果没有攻击,就是代码问题:
无限 while 循环
大量循环内查数据库
大数组遍历、排序
图片压缩、生成 PDF 等耗时操作
排查方式:
1、查看网站最新更新的插件、主题、功能
2、关闭最近新增功能,观察 CPU 是否下降
3、开启 PHP 慢日志,定位慢函数
开启 PHP 慢查询:
request_slowlog_timeout = 2 slowlog = /www/logs/php_slow.log
六、第六步:系统层面排查(定时任务、计划任务)
有些 CPU 高是定时任务触发:
crontab -l ls /etc/cron.d/ cat /etc/crontab
看是否有:
备份任务集中执行
日志切割集中
木马定时重启
统计脚本频繁运行
七、临时应急方案(先恢复网站访问)
1、重启 PHP-FPM
service php-fpm restart
2、重启 MySQL
service mysqld restart
3、限制 PHP 进程数
4、开启宝塔防火墙,暂时封禁异常 IP
八、预防 CPU 100% 的长期建议
1、开启 MySQL 慢查询,持续优化 SQL
2、网站添加静态缓存,减少 PHP 执行次数
3、限制爬虫频率,屏蔽恶意 UA
4、代码避免死循环、减少循环内 SQL
5、重要页面做 Redis 缓存
6、定期查杀木马,做好服务器安全加固
标签: 服务器 CPU100% Linux CPU 高负载排查 php-fpm 占满 CPU MySQL CPU 过高 CC 攻击排查


