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

PHP-FPM静态模式下max_children值在压力测试中无显著影响的原因咨询

PHP-FPM静态模式下max_children值在压力测试中无显著影响的原因咨询

最近几天我一直在Ubuntu Server 22.04上用wrk对静态模式的PHP-FPM做压力测试,搭配NGINX,每一种测试场景的结果我都仔细记录了。但看完结果我彻底懵了——max_children的数值好像对性能没多大影响?

网上所有文章都在教怎么计算合适的max_children值来最大化性能,但这些方法在我的场景里似乎完全不适用。

先说说我的测试基础配置:

  • 服务器:4核CPU,4GB内存
  • 测试脚本:PHP脚本,从MySQL拉取并打印约11k行数据,生成的输出文档大小约1MB
  • PHP-FPM进程平均内存占用:12.5MB

测试出来的结果特别反常:

  • 当max_children设为10、50、100时,性能结果完全一致;设为200时服务器直接过载
  • 设为4的时候性能比前面几个值略低,但差距很小;设为8的时候就已经和10、50、100的结果几乎无差别了
  • 不管max_children是4、8、10、50还是100,最多都只能处理500个连接,超过这个数就开始出现超时和请求丢失

这让我怀疑是不是和CPU核心数有关,但又没法完全对应上。后来我按照Rick的建议调整了MySQL的max_connections,从默认的151调到了351(根据可用内存计算的最大值),但结果完全没变化。于是我回到原点,从max_children=1和单线程wrk开始逐步往上测,结果发现了更多没法解释的现象:

  • 看起来只有max_children=6是有实际意义的,超过这个值之后,请求处理量再也没有任何提升
  • 用单线程wrk测试时,CPU负载会随着PHP-FPM子进程数量增加而上升,之后不管wrk发起多少连接,负载都保持稳定不再变化
  • 30秒压力测试的总请求量上限大概是11371次,从max_children=6开始就能达到这个值,此时CPU负载会冲到90%——不管再怎么调高max_children,请求量都没法再涨了
  • 还有个奇怪的现象:用4线程wrk测试时,相同连接数下的总请求量比单线程测试低,但延迟更低(这点我大概能理解)。但CPU负载方面,当连接数低于8时,不管max_children是多少,负载都在70%左右;一旦连接数升到9,CPU负载会突然飙升20%以上,而且max_children越高,飙升得越厉害。我能想到的只有和4核CPU有关,可能每个核心最多处理2个并发连接?除此之外完全摸不着头脑。

我自己的猜测是,至少在我的场景里,瓶颈应该是CPU——我从来没出现过内存不足的情况,NGINX和MySQL的连接数上限都设得很高。还是想请大佬帮忙确认一下这个猜测,再详细解释下背后的原因,谢谢!

备注:内容来源于stack exchange,提问作者Medito Di Terra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:45:27