场景描述
MongoDB 的服务模型是每个网络连接由一个单独的线程(one-thread-per-connection)来处理,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。每次请求都建立连接和鉴权会极大的影响性能。因此,限制实例的连接数,使用完毕规范化及时释放连接,是保障数据库稳定的必要条件。
登录 MongoDB控制台,在系统监控页面,查看实例监控指标连接百分比的趋势变化图。连接百分比指当前集群的连接数量与最大连接数的比例。若达到最大连接数,将会导致连接响应变慢,甚至连接失败的现象。因此,当连接使用率超过85%,请及时进行排查处理。
排查与解决
序号 | 可能原因 | 排查方式 | 解决方法 |
1 | 请您自行排查客户端连接池配置参数是否适合业务场景。 | ||
2 | 业务侧存在较多无实际业务请求的连接。 | 请借助数据库智能管家(TencentDB for DBbrain,DBbrain)的诊断优化功能,在实时会话页面,排查业务侧所有连接的客户端信息,是否为业务实际真实所需要的连接。 | |
3 | 存在大量慢查询,连接一直占用未释放。 | 1. 请借助数据库智能管家n(TencentDB for DBbrain,DBbrain)的诊断优化功能,在慢 SQL 分析页面,查询数据库当前的所有慢日志的记录和执行信息统计数据及视图。具体信息,请参见 诊断优化。 2. 请登录 MongoDB 控制台 ,单击实例 ID,进入实例详情页面,选择数据库管理页签,单击慢日志查询,通过抽象排查,排查具体的慢查询信息。具体查询方法,请参见 慢日志管理。 | 针对慢查询,请进行索引优化。 可借助数据库智能管家(TencentDB for DBbrain,DBbrain)索引推荐 ,选择最优的索引。 请参见最佳实践 索引优化解决读写性能瓶颈,提升数据库性能。 |
4 | 连接泄露,存在未释放的链接。 | 重启 mongos 实例, 导致实例所有的连接在重启的一瞬间中断,业务直接进行重连即可,不存在持续影响业务的可能。若重启后业务连接数迅速增加又导致连接使用率100%,则说明业务确实存在大量有效连接,不属于连接泄漏的场景。具体操作,请参见 重启实例。 | 直接在控制台提升连接,临时解决业务突发的状况,具体操作,请参见 连接数管理。 调整实例配置规格,副本集实例,提升Mongod 的 CPU 与内存配置,可同步提升实例的最大连接数量。具体信息,请参见 变更 Mongod 节点配置规格。分片集群,请提升 Mongos 的节点规格,或增加分片数量。具体操作,请参见 变更 Mongos 节点配置规格 与 调整分片数量。 |
5 | 业务量突增,当前实例配额不足 | 请参见序号2的排查方法。 | |
连接池使用建议
参数 | 单位 | 参数含义 | 配置建议 |
maxPoolSize | 数量 | 配置连接池每个客户端所能申请的最大连接数量。 | 该参数与客户端数量的乘积务必小于实例的最大连接数,避免连接数量过多而导致无法连接。 |
minPoolSize | 数量 | 配置连接池每个客户端所能申请的最小连接数量 | 该参数与客户端数量的乘积小于实例的最大连接数,避免业务突发需要新建太多连接而后端实例资源消耗供应不足。 |
socketTimeoutMS | 毫秒 | 配置发送和接受 sockets 等待响应的超时时间。默认为0,指不超时。 | 建议根据业务实际场景设置,避免当 MongoDB 服务端异常故障引起主备切换之后,客户端一直等不到服务端响应的消息包,而导致此无效连接资源一直被占用。 |
maxIdleTimeMS | 毫秒 | 配置一个空闲连接在被删除或者关闭之前存在的最大时间。 | 建议业务调整为1小时内,避免空闲连接一直占用连接资源。 |
heartbeatFrequencyMS | 毫秒 | 配置客户端给服务端发送心跳的频率。用于客户端定期检查与后端数据库连接的存活情况。 | 建议配置10s内,便于第一时间识别服务端的运行状况,避免产生无效连接。 |