欢迎光临好主题官网!致力于 WordPress 企业主题定制开发及 WP外贸模板下载。

宝塔服务器内存占用高达 6.5G 排查实录:PHP-FPM 配置失控导致内存暴涨

文章目录

问题背景

服务器环境:

  • Linux(Alibaba Cloud)
  • 宝塔面板
  • Apache + PHP-FPM + MySQL
  • 16个网站
  • 4个 WordPress 网站
  • PHP 5.6 / 7.4 / 8.0 共存
  • 内存 8GB

某天登录服务器发现内存长期处于高占用状态:

free -h

输出:

total        used        free      shared  buff/cache   available
7.4G         6.5G        553M       18M       741M        553M

虽然网站访问正常,但可用内存已经非常低。

第一步:检查系统负载

查看系统状态:

top

发现 CPU 使用率很低:

Cpu(s): 91% idle

说明问题不是 CPU,而是内存占用异常。

第二步:定位内存消耗进程

查看内存占用最高的进程:

ps aux --sort=-%mem | head -20

发现大量 PHP-FPM 进程:

php-fpm: pool www
RSS ≈ 110MB

进一步统计:

ps -ef | grep php-fpm | grep -v grep | wc -l

结果:

95

服务器中竟然运行着 95 个 PHP-FPM 进程。

第三步:检查 MySQL

查看 MySQL 占用:

ps aux | grep mysqld

结果:

mysqld RES ≈ 500MB

对于 16 个站点来说非常正常。

因此可以排除:

  • MySQL 配置异常
  • 慢查询导致内存暴涨

问题基本锁定在 PHP-FPM。

第四步:检查 PHP-FPM 配置

查看 PHP 8.0 配置:

cat /www/server/php/80/etc/php-fpm.conf | grep pm.

结果:

pm = dynamic
pm.max_children = 150
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30

PHP7.4 和 PHP5.6 也是完全相同的配置。

看到这里问题已经很明显:

pm.max_children = 150

对于 8G 内存服务器严重超配。

为什么会导致内存暴涨?

实际统计发现:

单个 PHP-FPM 进程 ≈ 100MB

理论上:

100MB × 95
≈ 9.5GB

虽然部分内存共享,但实际占用数 GB 完全正常。

这也是服务器内存长期居高不下的根本原因。

第五步:发现 Apache 配置异常

继续检查 Apache:

grep -R "MaxRequestWorkers" /www/server/apache/conf

结果:

MaxRequestWorkers 3200

查看:

grep -R "ServerLimit" /www/server/apache/conf

结果:

ServerLimit 3200

这个配置对于企业站来说完全离谱。

服务器只有 8G 内存:

MaxRequestWorkers 3200
ServerLimit 3200

等于允许 Apache 无限扩张。

一旦遭遇搜索引擎爬虫:

  • Amazonbot
  • AhrefsBot
  • DotBot
  • SemrushBot

就可能导致 Apache 和 PHP-FPM 同时膨胀。

第六步:创建 Swap

原服务器没有 Swap:

Swap: 0

增加 2G Swap:

fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

验证:

free -h

显示:

Swap: 2.0G

完成。

第七步:调整 PHP-FPM

通过宝塔面板修改:

软件商店
→ PHP
→ 设置
→ 配置修改

修改为:

pm = dynamic

pm.max_children = 40
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

pm.max_requests = 500

保存并重启 PHP。

第八步:调整 Apache

通过宝塔面板:

软件商店
→ Apache
→ 设置
→ 配置修改

修改:

ServerLimit 300
MaxRequestWorkers 300

保存并重载 Apache。

优化后效果

再次检查:

free -h

结果:

total        used        free      shared  buff/cache   available
7.4G         1.9G        4.8G       18M       741M        5.2G

查看 PHP-FPM 数量:

ps -ef | grep php-fpm | grep -v grep | wc -l

结果:

22

优化前后对比:

项目 优化前 优化后
内存占用 6.5G 1.9G
可用内存 553MB 5.2G
PHP-FPM进程 95 22
Swap 2G
Apache Worker 3200 300

验证是否配置过小

检查 PHP-FPM 是否达到上限:

tail -100 /www/server/php/80/var/log/php-fpm.log | grep max_children

以及:

tail -100 /www/server/php/74/var/log/php-fpm.log | grep max_children

结果均为空。

说明:

当前 PHP-FPM 配置完全够用

没有出现:

server reached pm.max_children setting

的告警。

最终结论

本次问题并不是:

  • MySQL 占用过高
  • WordPress 插件问题
  • CPU 性能不足

真正原因是:

1. PHP-FPM 严重超配

pm.max_children = 150

导致 PHP 进程膨胀。

2. Apache 配置严重超配

ServerLimit 3200
MaxRequestWorkers 3200

为后续内存暴涨埋下隐患。

3. 没有配置 Swap

服务器缺少缓冲空间。

最终状态

优化完成后:

内存使用:1.9G
可用内存:5.2G
PHP-FPM:22个
Swap:2G
CPU空闲:90%+

服务器恢复健康运行。

对于中小型企业站、外贸站、展示型 WordPress 网站来说,这套配置已经足够长期稳定运行。

本文由 好主题 原创整理,致力于分享实用的 WordPress 建站知识与主题开发经验。 我们专注于提供高质量的 WordPress企业主题 资源,帮助中小企业轻松构建专业网站。 转载请注明来源,并保留原文链接,感谢您的支持与理解。

联系我们

教程看不懂?联系我们免费为您解答!免费助力个人,小企站点!

客服微信
相关文章
主题推荐
还没有账号?

会员注册

成为会员,获得更多专属优惠!

验证码: 加载中... =

已有账号?