服务器 CPU 100% 排查思路:从进程到日志一步定位

iT日记 建站运维

服务器 CPU 100% 排查思路:从进程到日志一步定位-第1张图片-iT日记

服务器 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 攻击排查