Mongos连接未释放引发连接耗尽故障求助
MongoDB分片集群连接泄漏问题解决
问题诊断
- mongos日志出现
Too many open files错误,确认是文件句柄耗尽导致无法接受新连接 - PHP8服务器使用的新版MongoDB客户端库存在连接未回收问题,单服务器连接数达240,远高于实际活跃连接数(仅10)
- 总连接数超过450时触发连接超时,说明连接池回收机制未生效
解决措施
1. 显式回收PHP连接
在应用流程结束时主动关闭MongoDB客户端实例,避免连接长期持有:
// 销毁客户端实例前先关闭连接 $client->close(); unset($client);
若使用单例或依赖注入容器,需确保请求生命周期结束时执行销毁逻辑。
2. 调整MongoDB客户端连接池参数
通过配置限制连接池大小并启用空闲连接自动回收:
全局配置(php.ini)
mongodb.pool_size = 10 mongodb.max_idle_time = 30
代码内初始化客户端时指定
$client = new MongoDB\Client( 'mongodb://<mongos-host>:<port>/', [ 'poolSize' => 10, // 单个PHP进程最大连接数 'maxIdleTimeMS' => 30000, // 空闲连接30秒后自动回收 ] );
3. 提升mongos文件句柄限制
临时生效(无需重启mongos):
ulimit -n 10240 -p <mongos进程ID>
永久生效:
- 修改
/etc/security/limits.conf,添加:
mongos soft nofile 10240 mongos hard nofile 10240
- 重启mongos服务
4. 匹配PHP-FPM进程数与连接池配置
计算总连接数上限:总连接数 = PHP-FPM最大进程数 × 连接池大小,确保该值低于mongos的文件句柄限制(预留20%余量)。调整php-fpm.conf:
pm.max_children = 40
(结合poolSize=10,总连接数为400,低于10240的限制)
内容的提问来源于stack exchange,提问作者tkraja mdu
相关产品推荐
相关产品推荐

