内存占用突然升高的真实排查过程:不是爆内存,而是PHP进程异常堆积
今天在查看服务器状态的时候,发现一个比较明显的异常:内存占用突然升高。
而且不是缓慢增长,而是短时间内直接冲到80%以上。
网站虽然还能访问,但明显开始变慢,所以我马上进行了排查。
一、问题表现
当时的情况比较典型:
-
网站可以打开,但加载变慢
-
后台响应延迟增加
-
SSH登录没有卡死,但有延迟
-
内存占用明显偏高
二、第一步:查看内存整体使用情况
先用基础命令确认:
free -m
结果显示:
-
已用内存占比很高
-
可用内存明显下降
-
swap开始被占用
👉 说明不是“瞬时波动”,而是持续占用
三、第二步:查看具体占用进程
继续查进程:
top
排序后发现一个明显问题:
👉 多个 PHP-FPM 进程占用内存较高
而且不是单个进程,而是“多个同时偏高”。
四、第三步:判断是不是网站访问导致
我先排除攻击因素:
-
查看访问日志
-
检查IP连接数
-
没有异常暴涨请求
👉 基本可以排除攻击或流量异常
五、第四步:检查PHP-FPM状态
继续查看PHP进程状态:
ps aux | grep php-fpm
发现一个关键现象:
👉 PHP进程数量明显比平时多
而且部分进程长期未释放。
六、问题真正原因
进一步判断后发现原因:
👉 PHP-FPM进程没有正确回收
👉 某些请求执行时间过长
👉 进程持续堆积导致内存占用上升
简单来说就是:
请求没有及时结束,导致进程越来越多
七、临时处理方法
为了先恢复网站,我做了以下操作:
1. 重启PHP服务
systemctl restart php-fpm
2. 释放内存缓存
sync; echo 3 > /proc/sys/vm/drop_caches
3. 结束异常进程
手动kill掉占用较高的PHP进程
八、恢复效果
处理后效果比较明显:
-
内存占用快速下降
-
网站访问恢复正常
-
后台响应速度恢复
-
swap占用逐渐消失
九、后续优化措施
为了避免再次出现,我做了几个调整:
-
限制PHP-FPM最大进程数
-
调整request超时时间
-
开启慢请求日志
-
优化部分耗时接口
十、这次问题的核心结论
这次问题本质不是“内存不够”,而是:
👉 PHP进程没有正常释放 + 请求执行过长导致堆积
📌 总结一句话
内存突然升高,大多数情况不是爆内存,而是:
👉 进程异常堆积导致资源持续占用