「MongoDB 周四变慢了」:mongo-health 把三个月的秒级历史全读了一遍
周一早上 9 点,应用团队发来消息:”周四下午 MongoDB 变慢了,怎么回事?”没有告警、没人看过当时的监控——现在这是你的问题了。答案通常藏在 FTDC(Full Time Diagnostic Data Capture)里:每个 mongod 每秒都会把自己的指标采样写进 diagnostic.data。但 Percona 实测:Atlas 上一个跑生产流量的 M10,FTDC 只保留 2 到 5 天——到周一,周四可能已经没了。就算文件还在,你在图表上翻周四下午,前十张图没答案就得再翻四十张,剩下的从来没人看。
mongo-health 就是替你把这段阅读干完的开源工具(Apache 2.0):自托管副本集和 Atlas 都支持,把 FTDC 每秒粒度保留 3 个月,每小时跑 68 条检查规则,每个集群给一个结论。三个 Docker 容器跑在你笔记本或服务器上,数据库主机上什么都不用装,四条命令安装完毕。

点开一条发现就是一张卡片:磁盘写入最多 400ms(规则线是 10ms),图表逐秒展示三个成员的表现,下面一行字告诉你这是这个集群第三次发生——”运气不好”就这样变成了可以拍给存储团队的规律。修好之后按一下”I fixed this”留个备注,卡片从报告里消失,复发时它会自动标成 repeat。
六条最常见的报障,和图表给出的答案
以下标题都是应用团队隔三差五扔给 DBA 的原话。六个场景里五个是 Percona 实验室里故意制造的(三成员 Percona Server for MongoDB 8.0 副本集),第六个是 Atlas M10 上自己发生的,截图无一修改。
| 报障原话 | 真实原因 | 规则阈值 |
|---|---|---|
| 报表页昨晚超时 | 无索引查询:每返回 1 条要读约 1000 万条文档,持续 10 分钟 | 扫描比 >100:1 |
| 22:15 前后写入超时 | 磁盘变慢:三成员写入全部高达 400ms,已第 3 次 | 写入 >10ms |
| 查询偶尔慢 | 单个成员每秒重传最多 30 个 TCP 段、持续约 30 秒——数据库没问题,是路断了 | 重传 ≥5/s |
| 全局卡了几秒 | checkpoint 从亚秒级涨到 6-11 秒,10 分钟里发生两次 | 持续 2 分钟 >1s |
| 没人报告:oplog 涨太快 | 每秒约 250 次写看着无害,但每次重写整个 20KB 文档,1 小时灌满 oplog(正常一天) | journal 速率 >3.91 KiB |
| 月报跑得巨慢 | cache 缩到 128MB 扫 1.9GB 集合,WiredTiger 每秒从磁盘拉 2 万-6.8 万页 | >1 万页/s |



数据通道很克制:自托管副本集只需要 clusterMonitor 角色,poller 每 10 秒调一次 getDiagnosticData;Atlas 用权限最低的 Project Read Only API key;也支持直接上传 support bundle 的 diagnostic.data。
它还不做什么(同样重要)
mongo-health 不替代监控:FTDC 每小时才读一次,问题最坏情况延迟一小时才上页面,且从不主动告警——叫醒服务留给 PMM。目前只支持副本集,分片集群还没支持。
小夏点评
- 这篇点破了 DBA 工作的一个结构性盲区:秒级历史一直在被写进磁盘(FTDC),却几乎从不被阅读——告警只看”现在”,事后取证全靠翻图。”68 条规则自动读历史”这个思路,对任何有秒级历史数据的系统(PG 的 pg_stat、MySQL 的 performance_schema)都成立。
- “每分钟都有价值的数据,但没人有时间看”是工具机会的黄金定义——Percona 用三个 Docker 容器、零 agent、最低权限把这件事做成开源产品,商业监控厂商的”AI 根因分析”在渗透率上未必打得过这种轻工具。
- 对中国 IT 行业的启示:国内 MongoDB 存量大(游戏、日志、IoT),但运维普遍”告警驱动”,事后归因基本靠猜。这类读历史的轻量开源工具特别适合金融、游戏这类审计严格、事后复盘频繁的环境;值得注意的是数据通道全部走最低权限只读角色,对数据合规敏感的团队可以照这个权限模型抄作业。
参考链接
- 原文(Percona):https://www.percona.com/blog/mongodb-was-slow-on-thursday-answering-the-app-team-with-mongo-health
- mongo-health(GitHub):https://github.com/percona/mongo-health
- MongoDB FTDC 手册:https://www.mongodb.com/docs/manual/reference/faq/#std-label-faq-mongodb-performance-issues
