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
相关产品推荐
相关产品推荐

