首页/数据/NoSQL 速查/WiredTiger 缓存与存储引擎观察
MongoDB99 条

WiredTiger 缓存与存储引擎观察

WiredTiger 是默认存储引擎:内存缓存默认取(物理内存 - 1GB)的 50%,可用 cacheSizeGB 调整;缓存压力大时出现频繁淘汰与读放大。

NoSQL 速查数据更新于 2026-10-13

是什么

WiredTiger 是 MongoDB 3.2 起的默认存储引擎,负责数据在内存与磁盘之间的组织:文档以压缩形式落盘,热点数据页驻留内存缓存;缓存装不下时先淘汰页,脏页达到阈值时由后台检查点刷盘。观察它的缓存指标是判断「内存够不够、是磁盘慢还是缓存小」最直接的依据。

基本信息

默认缓存取物理内存减去 1GB 后的一半,且不低于 256MB
配置项storage.wiredTiger.engineConfig.cacheSizeGB
落盘节奏storage.syncPeriodSecs 控制检查点周期,默认 60 秒
压缩集合默认块压缩为 snappy,可换 zlib 或 zstd;日志压缩可单独配置
观察入口db.serverStatus().wiredTiger.cache、db.stats()、db.collection.stats()

典型使用场景

  • 内存评估:看缓存是否长期接近上限,判断是否需要加内存或减少工作集
  • 写入卡顿定位:应用线程被迫参与页淘汰时,写入延迟会出现锯齿状抖动
  • 压缩收益核算:切换压缩算法后对比磁盘占用与 CPU 开销
  • 容量规划:结合集合压缩率估算磁盘需求,而不是直接用原始数据量
  • 故障排查:升级或参数调整后,用缓存指标确认行为是否回到基线

读取缓存指标

读取缓存指标
const c = db.serverStatus().wiredTiger.cache
printjson({
  current: c["bytes currently in the cache"],      # 当前缓存占用字节数
  max: c["maximum bytes configured"],             # 缓存上限,与 cacheSizeGB 对应
  readInto: c["pages read into cache"],           # 从磁盘读入的页数,持续增长说明未命中
  evictedByApp: c["pages evicted by application threads"],  # 应用线程被迫淘汰页:压力信号
  dirty: c["tracked dirty bytes in the cache"]    # 待刷盘的脏数据量
})

print(c["maximum bytes configured"] / 1024 / 1024 / 1024)  # 换算成 GB,核对与配置是否一致
db.serverStatus().mem                                        # 进程常驻内存,用于与缓存上限对比

缓存指标读法

指标含义异常信号
bytes currently in the cache当前缓存占用长期贴着上限运行
maximum bytes configured缓存上限与物理内存比例明显偏大或偏小
pages read into cache从磁盘读入的页数持续高速增长,说明工作集大于缓存
pages evicted by application threads应用线程亲自淘汰页数值持续上升即缓存压力大
tracked dirty bytes in the cache缓存中的脏数据量接近上限时触发强制刷盘,写入抖动
缓存限制的是存储引擎的工作集,不是进程的全部内存:连接处理、聚合、排序、索引构建都在缓存之外额外占用内存,所以不要按缓存大小来推断进程的实际内存上限。
缓存调大要留余量:把大部分物理内存都给 WiredTiger 会挤压操作系统的页缓存与其他进程,一旦发生换页,磁盘负载会急剧上升;调整前先确认机器上还跑着哪些进程。

易错点

  • 只看缓存占用不看淘汰指标:占用高不一定有问题,页无法被有效淘汰才是压力信号
  • 把 cacheSizeGB 设成物理内存的绝大部分:系统页缓存被挤掉后整体 IO 反而变慢
  • 以为缓存能装下全部数据:全量扫描型业务的工作集天然大于缓存,应考虑改数据模型或加只读节点
  • 用原始数据量估算磁盘:忽略压缩率会高估容量需求,切换压缩算法后需要重新核算

数据来源与参考

  • MongoDB Manual: WiredTiger Storage Engine
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌