PHP-fpm MongoDB 连接数爆了问题
问题
一天运维报告说,MongoDB
连接数报警了,个人比较郁闷,因为我们业务并发不大,平时并发请求才10个不到,而MongoDB
连接数有400个,服务有10个。按照常理说连接数不超过100才对噻。
我们的服务架构:nginx+php-fpm
。php版本是7.1.16php-fpm
配置采用了pm = dynamic
配置
后来运维给出MongoDB
连接数客户端分布,发现确实是php占用了大量的连接,一个服务高达40左右。现在可以确定是确实是php占用了大量连接。只有排查原因。
原因
最后在一位公司同事阅读了php7
相关源码才发现,php7
的MongoDB
扩展中,php客户端是长连接(及时请求结束,只要php-fpm进程没有杀掉,连接就一直保持,目的是下次请求时减少连接带来的性能消耗),并且没有关闭连接的函数。
解决办法
而我们php-fpm配置中,pm.min_spare_servers = 100
,pm.max_spare_servers = 200
,空闲进程是至少开了100,所以大量空闲连接占用了MongoDB
连接。
然后我们根据实际情况,配置改为pm.min_spare_servers = 5
,pm.max_spare_servers = 10
。重新部署后解决问题。连接数降了下了,没有超过100.
总结
在PHP7中,MongoDB
是长连接,一个请求完,对应得php-fpm
进程没有被kill掉化,这个连接不会断开,会一直保持。所以要减少连接个数,需要合理设置php-fpm
空闲进程数
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: