宝塔面板CPU跑满排查是指通过检查服务器进程、网站日志、数据库查询、计划任务和安全状态,找出导致CPU使用率持续接近100%的异常进程或请求并加以处理。
快速定位高占用进程
登录宝塔面板后,先打开“监控”页面查看CPU占用曲线,确认是否持续跑满,再进入终端或使用SSH执行以下命令:
top-c
按大写 P 键按CPU占用率排序,观察排名靠前的进程,常见高占用进程包括 php-fpm、mysqld、nginx、httpd、java、node,也可能是伪装成系统进程的生产程序,记录进程PID和COMMAND列。

再执行:
psaux--sort=-%cpu|head-20
可以直接列出CPU占用最高的20个进程,输出中可以看到用户、PID、CPU、内存、启动时间和完整命令,如果进程名似曾相识但路径可疑,需要进一步检查。
PHP-FPM 占用过高
如果发现 php-fpm 进程占用大量CPU,通常是网站代码中存在死循环、递归调用、大量计算或外部请求超时。
查看具体网站
多个PHP站点共用PHP-FPM时,需要确认是哪个网站引起的,宝塔面板的网站列表会显示每个站点的PHP版本,如果所有站点共用一个PHP版本,可以逐个暂停站点观察CPU变化。
开启PHP慢日志
进入宝塔面板 -> 软件商店 -> 已安装PHP -> 设置 -> 配置修改,找到慢日志相关配置:
slowlog=/var/log/php-slow.log request_slowlog_timeout=5s
修改后重载PHP,慢日志会记录执行超过5秒的脚本路径和函数调用栈,帮助定位具体代码位置。
查看慢日志:
tail-f/var/log/php-slow.log
输出中会出现脚本路径和具体函数,直接定位到异常代码。
查看PHP进程
ps-ef|grepphp-fpm psaux|grepphp-fpm|grep-vgrep
如果有很多进程一直处于 R 状态(运行中),并且同一个脚本反复出现,基本可以确定是代码问题。
跟踪进程
strace-pPID-c
跟踪某个高占用PHP进程,查看系统调用分布,如果是死循环,可能会看到大量 read、write、poll 等调用。
调整PHP-FPM参数
进入PHP设置 -> 性能调整,根据服务器内存适当调整:
max_children:最大子进程数,防止进程过多拖垮CPUstart_servers:启动进程数min_spare_servers:最小空闲进程数max_spare_servers:最大空闲进程数max_requests:每个进程最大处理请求数,适当调小可以释放异常进程
例如在4核8G服务器上,可将 max_children 设为50,max_requests 设为500。
MySQL 占用过高
查看正在执行的SQL
通过宝塔面板的数据库管理或终端进入MySQL:
mysql-uroot-p showprocesslist;
或直接执行:
mysql-uroot-p-e"showfullprocesslist"
查看 Time 列较大的SQL语句,分析是否缺少索引或数据量过大。
开启慢查询日志
在MySQL配置中开启慢查询:
slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=2
然后分析慢日志找出执行时间超过2秒的SQL。
查看MySQL线程
top-H-p$(pgrepmysqld)
查看mysqld进程内哪个线程占用CPU高,再结合 show processlist 定位SQL。
常见优化
为常用查询字段添加索引
清理历史数据
修复损坏表:
repair table 表名优化表:
optimize table 表名检查是否有锁表:
show open tables where in_use > 0修改数据库缓存配置,如
innodb_buffer_pool_size
如果业务数据量大,可考虑读写分离或增加服务器配置。
Nginx/Apache 占用过高
Nginx或Apache本身通常占用CPU不高,如果异常升高,多为请求量过大或遭受cc攻破。
查看访问日志
tail-f/www/wwwlogs/站点名.log
观察是否有大量相同URL请求、扫描请求或异常UA。
查看连接数
netstat-ntu|awk'{print$5}'|cut-d:-f1|sort|uniq-c|sort-nr|head-20统计连接来源IP排名,如果某个IP连接数异常多,可以直接封禁。
配置防火墙和限流
在宝塔面板安装Nginx防火墙或Apache防火墙,开启CC防护、IP黑名单、频率限制、UA过滤、防扫描等功能。
在网站配置中增加:
limit_req_zone$binary_remote_addrzone=req_one:10mrate=10r/s; limit_conn_zone$binary_remote_addrzone=conn_one:10m;
并在server块中引用:
limit_reqzone=req_oneburst=20nodelay; limit_connconn_one20;
检查代理和缓存
如果网站有动态接口频繁请求,可配置缓存或CDN,减少源站压力。
计划任务和脚本异常
宝塔面板的计划任务中可能存在死循环脚本、间隔过密的备份任务或采集任务。
打开宝塔面板 -> 计划任务,逐个检查任务类型、执行周期和脚本内容,对于Shell脚本:
#!/bin/bash whiletrue do php/www/wwwroot/xxx/artisanqueue:work sleep1 done
这种写法如果没有正确退出机制,可能不断拉起进程。
执行以下命令查看系统计划任务:
crontab-l
检查是否有不明定时任务,再查看:
tail-f/var/log/cron
观察计划任务执行日志。
生产木码排查
CPU跑满最常见的外部原因是服务器被植入生产木码,木码通常会伪装成系统进程,如 kswapd0、httpd、nginx、kernel 等。
检查可疑进程
ls-l/proc/PID/exe
如果原本应该属于系统的进程路径指向 /tmp、/var/tmp、/dev/shm,基本可判定为木码。
检查定时任务和启动项
crontab-l cat/etc/rc.local ls-l/etc/init.d/ systemctllist-unit-files--type=service|grepenabled
查看是否有陌生脚本或服务设置为开机启动。
检查临时目录
ls-la/tmp ls-la/var/tmp ls-la/dev/shm find/-name"*.sh"-newer/etc/passwd-typef2>/dev/null
木码常用目录为 /tmp、/var/tmp、/dev/shm,找到可执行文件可先备份再删除。
清除和加固
杀掉木码进程:
kill -9 PID删除木码文件和相关脚本
清除计划任务和启动项
修改root密码、SSH端口
更新宝塔面板和系统补丁
安装宝塔系统加固插件
检查SSH登录日志:
last -f /var/log/wtmp | head -30
使用宝塔面板内置功能排查
宝塔面板提供了一些可以直接使用的工具。
监控
首页监控可以看到CPU、内存、磁盘IO、网络流量变化,确定跑满时间点。
进程守护管理器
软件商店安装“进程守护管理器”,可以查看和管理常驻进程,防止异常退出,也可以发现异常进程。
网络监控和防火墙
软件商店安装防火墙,在“网络监控”中查看实时连接,在“IP规则”中封禁异常来源。
网站日志分析
宝塔面板提供了网站日志查看和错误日志查看,可以在面板中直接搜索高频IP和URL。
文件管理搜索
使用文件管理中的搜索功能,搜索最近修改过的 .php、.sh、.pem 文件,排查后们文件。
预防CPU跑满的常规设置
及时更新宝塔面板、PHP、MySQL、Nginx等软件版本,修复安全漏洞。
修改SSH默认端口,禁用密码登录,使用密钥登录。
设置高强度面板密码、数据库密码,开启面板SSL。
安装宝塔防火墙、系统加固、防改动插件。
在PHP禁用危险函数:
disable_functions=exec,shell_exec,system,passthru,proc_open,popen,pcntl_exec,putenv
网站上传目录禁止执行PHP脚本。
定期备份网站和数据库。
配置Nginx/Apache请求频率限制和并发限制。
开启数据库慢查询日志并定期分析。
关闭不必要端口,仅保留80、443、SSH端口。
常用排查命令汇总
#查看CPU占用前十进程
psaux--sort=-%cpu|head-10
#查看内存占用前十进程
psaux--sort=-%mem|head-10
#查看PHP-FPM进程
ps-ef|grepphp-fpm
#查看MySQL进程列表
mysql-uroot-p-e"showfullprocesslist"
#查看实时连接
netstat-ntu|awk'{print$5}'|cut-d:-f1|sort|uniq-c|sort-nr|head-20
#查看计划任务
crontab-l
#查看进程可执行文件路径
ls-l/proc/PID/exe
#查看最近修改文件
find/www/wwwroot-typef-name"*.php"-mtime-1