虚拟机运行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利用率。
如果文章帮助了你,请帮我点击1次谷歌广告,或者微信赞助1元钱,感谢!
知识星球有更多干货内容,对我认可欢迎加入: