You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

永久生效:

  1. 修改/etc/security/limits.conf,添加:
mongos soft nofile 10240
mongos hard nofile 10240
  1. 重启mongos服务

4. 匹配PHP-FPM进程数与连接池配置

计算总连接数上限:总连接数 = PHP-FPM最大进程数 × 连接池大小,确保该值低于mongos的文件句柄限制(预留20%余量)。调整php-fpm.conf:

pm.max_children = 40

(结合poolSize=10,总连接数为400,低于10240的限制)

内容的提问来源于stack exchange,提问作者tkraja mdu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:47:21