在使用 Plesk面板管理网站、数据库以及多用户环境时,CPU 占用异常偏高是管理员最常遇到的问题之一。无论是突然飙升到 100%、持续保持在高负载状态,还是周期性出现峰值,都会对服务器的稳定性带来明显影响,甚至导致网站访问缓慢、面板卡顿、任务执行延迟。CPU 负载问题往往并非单一因素造成,而是多进程、多服务、系统资源竞争叠加的结果。因此要定位 CPU 消耗来源,需要从系统、应用、数据库、Plesk 内部守护进程、计划任务、恶意脚本等多个角度逐步深入排查。
当发现服务器 CPU 飙高时,第一反应应是通过 SSH 查看当前实时负载。命令 top 能帮忙快速获取进程占用情况:
top -c
添加 -c 参数可以显示执行命令的完整路径和参数,便于快速识别是 php-fpm、nginx、mysqld 还是 pleskd 进程导致负载升高。如果 CPU 主要被 php-fpm 占用,则很可能是高并发、恶意请求、脚本效率不足或者站点陷入死循环。若 top 显示 mysqld 占用极高,说明数据库正在执行慢查询、锁表操作、数据恢复或正在遭受高频访问。若是 sw-engine 或 pleskd 占用高,则说明 Plesk 内部服务正在运行某些任务,如备份、扫描、统计更新等。
当想更详尽地了解 CPU 的总体使用情况,可以使用 pidstat 工具,它能提供更细粒度的历史统计信息:
pidstat -u 1
以 1 秒刷新一次统计数据。通过观察一段时间内各进程的 CPU 占比变化,可以判断高负载是瞬时还是持续,并定位是否某进程周期性激增。例如某些 WordPress 计划任务、Drush cron、Magento 索引任务,会周期性触发 cpu 峰值。
若 top 显示 PHP 相关进程占用高负载,则需要进一步分析哪些网站或脚本触发了高 CPU。Plesk 会为每个域名创建独立的 php-fpm 池,因此通过 ps 可以快速识别来源:
ps -ef | grep php-fpm
进一步结合 CPU 占用查询:
top -H -p
可查看是哪个 worker 线程占用高,再通过 strace 跟踪:
strace -p <线程PID>
若看到大量重复系统调用,如 stat、open、read 等,说明站点可能陷入死循环或正在执行密集读取。若脚本卡在 mysql_query 或 connect 等调用上,则问题来自数据库性能。
数据库的高 CPU 占用通常来源于慢查询或未建立索引的高频操作。Plesk 默认使用 MariaDB/MySQL,可以通过以下命令分析:
mysqladmin processlist
查看当前执行的 SQL,若出现大量 Sleep 或 Waiting for table metadata lock,可以断定是锁表或慢查询引发的资源占用。开启慢查询日志有助进一步定位:
SET GLOBAL slow_query_log=ON;
SET GLOBAL long_query_time=1;
日志位置通常在:
/var/log/mysql/slow.log
通过 pt-query-digest 可进一步分析热点 SQL,这对于优化数据库负载非常重要。
除了数据库,Plesk 内部的一些守护服务也会在特定情况下占用大量 CPU。例如 sw-engine 是 Plesk 的核心 Web 进程,用于处理面板逻辑与 API 请求,若其占用过高,说明面板正在执行大量后台任务。Plesk 的任务队列 psa-queues(对应 psadump.sh、stat.sh、backup-manager 等脚本)在进行备份、日志解析、统计计算时都会大量消耗 CPU。
可通过:
plesk sbin health-monitor --statistics
查看 Plesk 自身监控到的 CPU 状态。若 backup-manager 占用高,则说明某个用户的大容量备份正在运行,可进入面板关闭自动备份或延迟任务执行。若 sysstat 或 logrotate 异常频繁执行,也会导致 CPU 周期性高峰。
更深层次的 CPU 异常则可能与恶意进程有关。例如脚本、隐藏的 PHP 回门、反弹 shell 生成的长期运行进程等都会伪装成正常进程占用 CPU。使用以下命令可快速发现异常:
ps aux --sort=-%cpu | head
若发现进程名为 kworker、syslogd、crond 的伪造进程,而路径在 /tmp、/var/tmp、/dev/shm,则基本可以判断为恶意脚本。还可使用:
lsof -p PID
查看进程打开的文件,从而判断其真实来源。如果怀疑 PHP 脚本被植入程序,可开启 PHP 错误日志与访问日志,结合:
grep -R "eval" /var/www/vhosts/
grep -R "system(" /var/www/vhosts/
查找高风险代码。
计划任务 cron 也是 CPU 高的常见原因之一。Plesk 为每个用户和系统服务创建 cron 任务,若用户配置了执行密集任务的计划脚本,也会造成 CPU 占满。可查看所有 cron 列表:
crontab -l
ls /var/spool/cron/
若某个任务执行间隔过短,应适当优化或延长任务周期。例如备份、日志清理、缓存预热、采集脚本等都可能在频繁执行中消耗大量 CPU。
Web 服务层面也可能触发 CPU 异常,如 Apache 和 Nginx 的高并发、恶意请求攻击、DDOS 导致的连接激增都会让 CPU 快速飙升。在 Plesk 中可查看 Apache 当前连接:
apachectl status
或启用 server-status 模块。在 Nginx 中可以:
netstat -ant | grep :80 | wc -l
查看连接数。若连接数暴增,应立即启用 Fail2ban、限制请求速率、启用防火墙策略,必要情况下接入上层 WAF 或 CDN。
当需要更深入了解系统资源竞争情况时,还可以使用 htop 替代 top:
htop
在 htop 中可以按 F5 查看树状结构、按 CPU 核心排序,从而判断是否是某个线程占满单核,或者整体多核都被占用。对于虚拟机环境来说,宿主机资源限制也可能引发 CPU steal 过高导致 Plesk 性能下降,可查看:
top | grep "st"
若 st(Steal)值持续高于 20%,说明宿主机资源超分配,应联系服务商调整。
若某些进程长期占用高 CPU,可通过 cpulimit 临时限制:
cpulimit -p -l 50
也可通过 Plesk 的资源限制功能为订阅用户配置 CPU 限制,防止单个站点拖垮整个服务器。
完成排查后,还应关注优化措施。例如为 PHP 站点启用 OpCache,大幅减少脚本 CPU 消耗;为数据库添加索引;优化 WordPress、Discuz、Laravel 等站点的缓存策略;为 Nginx 配置 gzip 与缓存;开启 Redis 或 Memcached 减少数据库压力;禁用不必要的 Plesk 扩展与后台统计任务。
同时定期清理日志、优化备份策略、限制不必要的计划任务,也能有效降低 Plesk 面板后台任务的 CPU 占用。更重要的是持续监控系统性能,可以搭配 Grafana、Netdata、Zabbix 等工具建立可视化监测,让 CPU 异常能够第一时间被发现。
相关内容
