php-fpm在kubernetes中的资源分配考虑

虚拟机运行php应用的时候,多个php应用共享虚拟机上同一套php-fpm进程池,很难(也不需要)评估单个应用的资源占用情况。

当php应用迁入到kubernetes之后,就被迫要开始精细化硬件资源分配,在保证服务质量的前提下提升集群资源利用率,这是个很有意思的问题。

经验迁移

在虚拟机时代,我们在8核机型运行了1000个FPM,可以保障足够的并发处理能力。

简单折算并约定单个POD采用1核100个FPM进程,运行一段时间后,观察内存实测占用不到2G。

如果性能不足则通过增加POD解决。

存在的问题

在实际运行中,我们发现部分应用存在一个典型的问题,这是在实施HPA弹性伸缩的过程中遇到的。

当HPA检测到POD的平均CPU利用率低于阈值时就会开始缩容,这时引发了服务超时。

经过分析发现,这类应用的并发较高,但是计算量较小,表现就是POD的CPU不高,但是PHP-FPM的活跃进程数较高。

我们通过prometheus采集POD内php-pfm的活跃进程数量,观察到100个FPM进程在没有缩容之前就已经有可能高达50-60个活跃进程数,当HPA触发缩容大约一半POD之后PHP-FPM进程数量就不够用了。

解决思路

一方面,我们需要做好PHP-FPM的prometheus监控与grafana展现,以便更高效的追溯问题。

另一方面,我们需要考虑使用V2 beta版本的HPA功能,结合对PHP-FPM的活跃进程数的自定义metrics以及CPU监控,实现更加安全的HPA。

最后,我们需要对应用进行精细化配置,对于IO类型应用应该降低单个POD的CPU配额以提升集群CPU利用率。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~