是什么
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 会挤压操作系统的页缓存与其他进程,一旦发生换页,磁盘负载会急剧上升;调整前先确认机器上还跑着哪些进程。