MongoDB 4.2.3副本集主节点内存占用过高响应缓慢问题咨询
高内存问题定位步骤
- 优先确认tcmalloc空闲内存占比:从给出的tcmalloc统计可以看到,当前页堆空闲列表内存高达92.4G,加上各级缓存的空闲内存总和近97G,占mongod实际总内存占用的31%,首先排查版本已知缺陷:MongoDB 4.2.3属于已停止维护的老版本,存在多个tcmalloc内存不主动回收的已知问题,该类问题会导致进程占用的内存只升不降。
- 排查业务异常操作:执行
db.currentOp({"active": true})查看当前运行的活跃操作,确认是否存在大量无索引的全表扫描、内存排序、大聚合任务,这类操作会占用大量临时内存,同时会挤出缓存中的热数据,进一步加重内存负担。 - 检查连接与游标资源:执行
db.serverStatus().connections确认当前连接数是否远高于业务正常水平,再通过db.serverStatus().metrics.cursor.open.total查看是否存在大量未关闭的游标,连接泄漏、游标泄漏都会导致内存持续上涨。 - 核对WiredTiger缓存配置:检查mongod配置文件中的
wiredTigerCacheSizeGB参数,默认值为系统可用内存的50%,188G内存的服务器默认缓存上限为94G,当前mongod常驻内存高达184G,远超出缓存上限,说明超额内存均为非缓存类占用(空闲内存、连接、临时操作等)。
内存恢复解决方案
紧急缓解措施
- 执行强制内存释放命令:在Mongo Shell中执行
db.adminCommand("releaseFreeMemory"),该命令会强制tcmalloc将空闲列表中的内存归还给操作系统,仅这一步即可释放近90G的物理内存,快速缓解内存不足、swap占用过高的问题。 - 若释放命令效果不明显,执行副本集主备切换:选择同步延迟低于1s的从节点提升为新主节点,待流量切换完成后重启原主节点的mongod进程,重启后内存占用会完全重置到正常水平。
- 临时暂停大批量的数据分析、数据导入导出任务,关闭非必要的慢查询操作,减少临时内存占用。
长期优化方案
- 升级MongoDB稳定版本:将4.2.3升级到4.4最新稳定版或更高LTS版本,新版本已修复tcmalloc内存不自动回收的缺陷,内存管理效率大幅提升。
- 合理配置WiredTiger缓存:如果服务器为MongoDB专用,可将
wiredTigerCacheSizeGB调整为系统内存的60%(约110G),避免缓存占用过高挤压其他内存需求。 - 开启慢查询日志,设置慢查询阈值为100ms,定期审计慢查询语句,为无索引的查询、排序操作添加合适的索引,减少临时内存消耗。
- 在应用端配置合理的连接池上限,避免连接数过高占用额外内存,同时配置游标自动超时规则,避免游标泄漏。
- 调整系统swappiness参数为1,减少操作系统将MongoDB内存页交换到swap分区的概率,避免性能劣化。
内容的提问来源于stack exchange,提问作者Tamar
相关产品推荐
相关产品推荐

