db.stats() 的 storageSize 不反映真实磁盘占用,因不含日志、检查点等;应直连各分片执行 db.runCommand({dbStats:1,scale:1048576}),并结合 du 和 wt 工具分析。

如何用 db.stats() 查分片磁盘占用却不被“数据量”误导
db.stats() 返回的 dataSize 和 storageSize 都是逻辑视图值,不反映底层文件系统真实占用。尤其在 WiredTiger 引擎下,storageSize 已经是压缩后的大小,但仍然不含日志、检查点、缓存文件等——这些全算在磁盘里。
实操建议:
- 必须连到每个分片的
mongos或直连该分片的mongod(不能只查 config server),否则看到的是聚合伪值 - 优先看
storageSize而非dataSize,因为前者更接近磁盘写入量;但要注意它不含wiredTiger/log/目录(默认可达几 GB) - 执行时加
{ scale: 1024*1024 },避免单位混淆(默认字节,不换算易误判) - 示例:
db.runCommand({ dbStats: 1, scale: 1048576 })—— 结果中storageSize单位是 MB
为什么 du -sh 看到的目录大小远大于 storageSize
WiredTiger 的压缩比只是影响 .wt 数据文件,而磁盘上还有三类“隐形大户”:日志文件(wiredTiger/log/)、检查点残留(WiredTiger.turtle + WiredTiger.wt)、以及未及时归档的旧日志。
常见错误现象:运维同学发现 du -sh /data/db 是 200GB,但 db.stats().storageSize 只有 80GB,以为压缩比高达 2.5x,其实差的那 120GB 里可能有 90GB 是日志。
实操建议:
- 进分片数据目录后,分别统计:
du -sh wiredTiger/log/
、du -sh *.wt
、du -sh journal/
(若启用) - 检查
wiredTiger/log/下是否堆积了大量WiredTigerLog.*文件(默认保留最后 10 个,但大写入场景下单个可达 100MB+) - 确认
storage.wiredTiger.engineConfig.journalCompressor是否为snappy(默认),它只压缩日志内容,不减少文件数量
从 WiredTiger 层面验证实际压缩比:读 WT_SESSION::query_timestamp 没用,得看 wt dump
官方文档提的 query_timestamp 是用于一致性读,和压缩率完全无关。真实压缩比必须通过 wt 工具解析数据文件头来估算——这是最接近物理层的方式。
使用场景:当需要向存储团队提供“为什么这个集合占盘这么小”的依据,或排查压缩失效(比如文本字段含大量随机 base64)。
实操建议:
- 停写或低峰期操作,用
mongod --shutdown后执行:wt -C "cache_size=1G,log=(enabled=false)" -h /data/db/ dump table:index-123-456789
- 输出里找
file size(磁盘占用)和data size(解压后大小),比值即为该表实际压缩比 - 注意:不同集合压缩比差异极大——时间戳字段多的集合可能只有 1.2x,而重复 JSON 结构的集合可达 4x+
- 不要对
collection-*.wt直接 dump,优先选大表(如collection-123-456789),小表误差高
分片集群下磁盘利用率不准的根源:moveChunk 过程中的双写残留
一个 chunk 迁移完成前,源分片和目标分片会同时持有该 chunk 的完整副本。迁移成功后,源分片不会立刻清理,而是等后台 dropPending 清理任务触发——这中间可能间隔数分钟到数小时,导致 du 和 db.stats() 都暂时虚高。
容易踩的坑:
- 在迁移刚结束时立刻跑磁盘巡检,把临时双写当成容量瓶颈,进而误扩容
- 依赖
sh.status()中的chunk distribution判断均衡性,但它不反映磁盘级残留 - 没查
db.adminCommand({ listDatabases: 1 }).databases里的empty字段——true表示该库已无 chunk,但目录可能还没删
真正要盯的是 db.getSiblingDB("config").collections.find({ dropped: true }) 和 db.getSiblingDB("config").chunks.countDocuments({ min: { _id: MinKey } }) 的差值。










