如何清除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' - 批量优雅终止这些进程:
如果TERM信号没效果,再用ps aux | grep apache2 | grep 'old gen' | awk '{print $2}' | xargs kill -TERMkill -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
相关产品推荐
相关产品推荐

