副本集节点内存告警需优先检查wiredtiger缓存使用率,若bytes currently in the cache / maximum bytes configured > 0.95,说明缓存逼近极限而非物理内存不足;脏数据占比超20%会阻塞写入,可通过调整eviction线程数(仅4.0+副本集)、优化cachesizegb(ssd建议60%~70%,hdd≤50%)、限制连接数等措施解决。

副本集节点内存持续告警,先看 wiredTiger.cache 实际使用率
不是所有“内存不足”都真缺物理内存——很多是 wiredTiger 缓存被撑满,导致写阻塞或查询延迟飙升。直接进 MongoDB Shell 执行:db.serverStatus().wiredTiger.cache
重点看两个值:bytes currently in the cache(当前缓存大小)和 maximum bytes configured(配置上限)。如果前者 ÷ 后者 > 0.95,说明缓存已逼近极限,不是系统内存不够,而是引擎自己“吃太饱”了。
storage.wiredTiger.engineConfig.cacheSizeGB 设置过大会挤占系统资源
这个参数不是越大越好。它控制的是 WiredTiger 自己能用的内存上限,但操作系统仍需留出空间给文件系统缓存、连接线程栈、排序临时缓冲区等。常见误配:
• 在 32GB 物理内存机器上设为 cacheSizeGB: 28,结果 top 显示 mongod 进程 RSS 达到 30GB+,触发 OOM killer
• 没考虑 SSD/机械盘差异:SSD 可设到 60%~70%,机械盘建议 ≤50%
推荐起始值:
• 16GB 总内存 → cacheSizeGB: 8
• 64GB 总内存 → cacheSizeGB: 32(SSD)或 24(HDD)
• 修改后必须重启 mongod,热加载不生效
脏数据堆积超过 20%,写操作会卡住
当 tracked dirty bytes in the cache 占比长期 >20%,WiredTiger 会主动阻塞新写入,直到脏页刷盘。这不是配置错误,而是写压力超出了当前清理能力。
- 检查是否在短时间批量插入大量文档(比如凌晨定时任务)
- 确认副本集同步延迟是否升高——Secondary 节点写入慢会导致 Primary 脏页积压
- 调整清理线程数(仅限 4.0+ 副本集):
db.runCommand({"setParameter":1, "wiredTigerEngineRuntimeConfig":"eviction=(threads_max=8,threads_min=4)"}) - 注意:
threads_max超过 8 会显著增加 CPU 开销,不建议盲目调高
连接数爆炸也会悄悄吃光内存
每个客户端连接默认分配最多 1MB 线程栈,1000 个空闲连接就可能占用 1GB 内存。现象是:mongostat 显示 conn 持续 >500,但 netIn/netOut 很低。
解决方法:
• 在 mongod.conf 中设置 net.maxIncomingConnections(如 500)
• 应用端启用连接池并设置合理 idle timeout(Node.js Driver 默认是 30 秒)
• 避免用短连接频繁建连——这是最隐蔽的内存泄漏源
wt.checkpoint.time 指标是否缩短,否则只是把压力从内存转嫁到了 I/O。











