You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清除Apache的(old gen)进程?解决Debian9下Apache重载内存溢出问题

解决Apache重载后(old gen)进程堆积导致内存耗尽的问题

我在处理Apache+PHP-Fpm环境时遇到过不少类似的情况,重载配置后旧进程无法正常退出堆积,最终拖垮服务器。下面给你几个可行的解决方案,按优先级排序:

1. 调整Apache优雅关闭参数(最推荐)

Apache 2.4.10+新增了GracefulShutdownTimeout参数,你的2.4.25版本刚好支持。这个参数能强制旧进程在指定时间内处理完现有请求后退出,超时直接终止,从根源避免堆积。

打开Apache主配置文件(比如/etc/apache2/apache2.conf),添加或修改以下参数:

# 给旧进程30秒处理现有请求,超时强制终止
GracefulShutdownTimeout 30
# 每个子进程处理1000个请求后自动退出,避免内存泄漏和僵死
MaxRequestsPerChild 1000

修改后不要用reload,执行service apache2 restart让新配置生效,之后再执行service apache2 reload时,旧进程就会在30秒内自动退出了。

2. 手动清理已堆积的(old gen)进程

如果当前服务器已经出现内存占用过高的情况,可以先手动清理这些旧进程:

  • 先确认哪些是标记为(old gen)的Apache进程:
    ps aux | grep apache2 | grep 'old gen'
    
  • 批量优雅终止这些进程:
    ps aux | grep apache2 | grep 'old gen' | awk '{print $2}' | xargs kill -TERM
    
    如果TERM信号没效果,再用kill -KILL强制杀死,但优先用TERM,尽量避免中断正在处理的用户请求。

3. 排查PHP-Fpm的连接问题

旧进程无法退出很多时候是因为和PHP-Fpm的连接没正常关闭,导致Apache进程一直挂着等待响应。你可以检查这两个关键点:

  • 调整PHP-Fpm的pm.max_requests参数(路径一般是/etc/php/7.2/fpm/pool.d/www.conf),比如设为500,让Fpm进程处理500个请求后自动重启,避免连接僵死。
  • 在Apache的proxy_fcgi配置块中添加ProxyTimeout,限制Apache等待Fpm响应的最长时间:
    ProxyTimeout 60
    

4. 减少不必要的重载操作

如果不是必须,尽量降低service apache2 reload的频率。频繁重载本身会触发大量新旧进程切换,更容易引发堆积问题。如果需要频繁调整配置,可以考虑使用Apache的动态配置加载特性,或者评估是否需要改用更灵活的部署方式(不过这个对现有环境改动较大,优先级较低)。


内容的提问来源于stack exchange,提问作者Vale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:58:29