maxconnectionsperchild 是结合内存增长趋势、业务请求特征和服务器资源反推的经验值,需通过监控rss变化、按业务类型动态调整,并避开设为0或只看平均值等陷阱,最后验证周期性波动与cps归零。

MaxConnectionsPerChild 不是靠公式直接算出来的固定值,而是结合内存增长趋势、业务请求特征和服务器资源反推出来的经验值。
看单进程内存实际增长速度
重点不是“理论上能跑多久”,而是“它实际多久开始明显变胖”。操作步骤如下:
- 用
ps aux --sort=-%mem | grep httpd抓几个活跃子进程的 RSS 值(单位 KB) - 每隔 10–15 分钟重复一次,记录同一 PID 进程的 RSS 变化(注意排除刚启动的新进程)
- 如果发现某进程每处理 3000 个请求后 RSS 上涨约 2–5 MB,且趋势稳定,那就可以把 MaxConnectionsPerChild 设在 5000–8000 区间——留出缓冲,避免等它撑到临界才回收
按业务请求强度动态调整
不同站点负载差异大,不能一刀切:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 纯静态文件服务(如图片 CDN):内存增长极慢,可设为 15000–20000,降低重启开销
- 含大量 PHP 渲染、JSON 解析或模板渲染的后台接口:每个请求可能残留缓存或未释放对象,建议 3000–8000
- 有上传/下载大文件、生成报表等重操作的路径:这类请求本身内存消耗高,应单独限流或设更低值(如 1000),配合代码层清理
避开两个典型陷阱
设值时容易踩的坑比设错更危险:
- 别设成 0:虽然表示“不限制”,但等于放弃主动内存回收机制,一旦存在轻微泄漏,几小时后 RSS 就可能翻倍
- 别只看平均值:有些请求会突发占用上百 MB 内存(比如导出 Excel),这时单靠 MaxConnectionsPerChild 挡不住;得配合 PHP 的 memory_limit、Apache 的 RLimitMEM,以及应用层 unset() 或 gc_collect_cycles()
验证是否真起效
改完配置重启后,必须观察两项指标才能确认设置合理:
-
ps aux --sort=-rss | head -5看 RSS 是否呈现周期性波动(升→降→升),而不是持续爬升 - 访问
/server-status?auto(需启用 mod_status),检查 CPs 字段是否接近你设的值,并在归零后新进程从 0 开始计数










