maxconnectionsperchild通过定期重启子进程强制释放内存以缓解累积,仅在event/worker模式生效(prefork用maxrequestsperchild),需置于对应块中,设5000–20000并完整重启验证。
直接在 apache 主配置文件(如 /etc/httpd/conf/httpd.conf 或 /etc/apache2/apache2.conf)中,针对当前启用的 mpm 模块添加 maxconnectionsperchild 即可控制子进程生命周期,缓解因长期运行导致的内存累积。它不是修复代码级泄漏,而是通过定期重启子进程强制释放全部内存。
确认当前使用的 MPM 模式
该参数只在 event 或 worker 模式下生效;prefork 模式下对应的是 MaxRequestsPerChild。先查清实际模式:
- 执行
httpd -V | grep -i mpm(CentOS/RHEL)或apache2ctl -V | grep -i mpm(Debian/Ubuntu) - 输出含
mpm_event_module或mpm_worker_module表示可用MaxConnectionsPerChild - 若显示
mpm_prefork_module,则应改用MaxRequestsPerChild
在对应 MPM 模块块内配置参数
不要写在全局区域,必须包裹在 <ifmodule mpm_xxx_module></ifmodule> 块中,否则无效:
- event 模式示例:
<ifmodule mpm_event_module><br> MaxConnectionsPerChild 10000<br></ifmodule>
- worker 模式同理,仅替换模块名:
mpm_worker_module - prefork 模式则用:
<ifmodule mpm_prefork_module><br> MaxRequestsPerChild 10000<br></ifmodule>
设置合理数值并验证是否生效
值太小会频繁 fork,增加 CPU 开销;太大则起不到及时释放作用:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 典型推荐范围:5000–20000,具体看单进程 RSS 增长速度(可用
ps aux --sort=-%mem | head -10观察) - 修改后必须 完整重启(
systemctl restart httpd或systemctl restart apache2),reload 不重置计数器 - 验证方式:开启
mod_status,访问/server-status?auto,检查CPs(Connections per child)是否周期性接近设定值后归零
注意这不是 Java 或 PHP 层泄漏的解决方案
MaxConnectionsPerChild 只影响 Apache 自身子进程的内存回收,对以下情况无效:
- PHP 脚本中未释放的大数组、静态缓存、未关闭的数据库连接
- Java 应用部署在 Tomcat 中时的 JVM 堆内存泄漏
- 单次请求就触发严重泄漏(如加载百兆文件到内存不释放)
这类问题需从代码或应用容器层排查,不能依赖 Apache 进程重启兜底。










