分片集群中单个mongod节点的cachesizegb必须显式配置,不可沿用默认50%物理内存值,否则易触发oom killer致节点反复离线;需按可用内存60%~70%设定,并区分primary/secondary调优缓存与淘汰线程。

分片集群里单个 mongod 节点的 storage.wiredTiger.engineConfig.cacheSizeGB 必须显式配置,且不能沿用默认的“50%物理内存”——否则容易因内存超限触发 Linux OOM Killer 杀进程,导致节点反复离线、被踢出副本集。
为什么分片集群里 WiredTiger 缓存默认值更危险
分片集群中每个 shard 节点本质是独立的副本集,但常被误当作“普通单实例”处理。默认缓存策略不感知集群角色:它只看本机内存,不考虑 mongos、config server、监控代理或同机其他服务的内存占用。一旦多个分片部署在同一物理机(常见于测试/中小规模环境),或节点上还跑着日志采集、备份脚本等,cacheSizeGB 没显式限制就极易突破 85% 物理内存红线,触发系统级 swap 或 OOM Kill。
现象包括:mongod 进程被 kernel: Out of memory: Kill process 日志终止、rs.status() 显示 stateStr: "UNKNOWN"、心跳失败后自动被踢出副本集。
实操建议:
- 查清该节点真实可用内存:运行
free -h,减去mongos、config server、OS 预留(至少 2GB)、其他进程所需内存 - 按剩余可用内存的 60%~70% 设置
cacheSizeGB(SSD 存储可取高值;机械盘压到 ≤50%) - 若为容器化部署(如 Kubernetes),必须用
resources.limits.memory严格限制容器内存,并在mongod.conf中将cacheSizeGB设为该 limit 的 65% 左右,避免容器被 OOMKilled
如何验证 cacheSizeGB 是否设得合理
光设值不够,得看运行时是否“稳住工作集”。关键指标来自 db.serverStatus().wiredTiger.cache:
重点关注三个字段:
-
"bytes currently in the cache"长期 > 90%"maximum bytes configured"→ 缓存吃紧,热数据开始被淘汰,查询延迟上升 -
"tracked dirty bytes in the cache"占比持续 > 20% → 写入压力大,eviction 线程跟不上,可能阻塞新写入 -
"pages evicted by age"数值飙升 → 缓存太“懒”,老化淘汰过多,说明evictionTarget可能偏低(默认 80),建议调至 85~90
注意:这些值需连续观察 15 分钟以上,避开定时备份、批量导入等干扰时段。
分片集群中 Secondary 节点要单独调缓存和淘汰线程
Secondary 不只是备份节点——它承担同步 oplog、提供读请求、参与选举。但默认配置和 Primary 完全一样,而它的写入模式(串行应用 oplog)+ 读负载(可能被路由大量查询)更容易让 WiredTiger 缓存失衡。
必须差异化配置:
- Secondary 的
cacheSizeGB建议比 Primary 低 10%~15%,防止同步流积压时缓存爆满 - 显式调高
evictionThreads:16 核以下设为 4(Primary 默认是 2),加速脏页清理,避免同步 lag 拉长 - Secondary 上禁用
readPreference: primary的客户端直连,否则会绕过 mongos 负载均衡,把压力集中到某台 Secondary 导致缓存雪崩
别忽略 OS 文件缓存与 WiredTiger 的协同关系
WiredTiger 缓存管的是“索引 + 文档页”,而 OS 文件缓存管的是“WAL 日志文件、checkpoint 文件、未映射的集合文件”。两者加起来不能超过物理内存的 85%。
常见踩坑点:
- 关闭
vm.swappiness=0后仍出现 swap → 实际是 OS 缓存膨胀 + WiredTiger 缓存双高,系统被迫 swap - 用
echo 3 > /proc/sys/vm/drop_caches清缓存后性能反而下降 → 说明工作集原本靠 OS 缓存兜底,WiredTiger 缓存设得太小 - 监控发现
cached字段持续 >30GB,但mongod进程 RSS 才 10GB → 这不是问题,是正常协作;真正要盯的是cacheSizeGB+cached+mongod RSS总和是否逼近物理内存
最易被忽略的一点:分片集群没有全局内存视图。每个 shard 节点的缓存配置必须独立评估、独立验证,不能复制粘贴同一份配置文件就上线。











