Linux 上监控 MongoDB 运行状态的实用方案
一 内置工具快速查看
mongostat --host localhost --port 27017 --username admin --password yourpassword --authenticationDatabase admin。关注字段:inserts/s、queries/s、updates/s、deletes/s、getmore/s、command/s、conn、faults/s、res、vsize、mapped、q r w。当 faults/s 持续偏高或 res 接近物理内存,可能存在内存压力;q/r/w 队列升高说明并发拥塞。mongotop --host localhost --port 27017 --username admin --password yourpassword --authenticationDatabase admin。用于定位最繁忙的集合与异常读写的命名空间。db.serverStatus()(返回连接、内存、网络、磁盘、操作计数、锁、后台刷新等)。db.stats()(返回集合数、对象数、数据/存储大小、索引数量与大小等)。db.yourCollection.stats()(定位单个集合的空间与索引使用)。二 慢查询与 Profiling
db.setProfilingLevel(2, { slowms: 100 });db.setProfilingLevel(1, { slowms: 100 });db.getProfilingLevel();查询记录:db.system.profile.find().sort({$natural: -1}).limit(20)。db.serverStatus().opcounters 与 db.currentOp() 观察当前执行与累计操作,辅助定位异常来源。三 系统层面资源监控
top -u mongod、htop(观察 CPU%、MEM%、负载 等)。iostat -x 1(关注 await、svctm、util 与读写吞吐);vmstat 1(观察 si/so 是否发生换入换出)。mongostat 显示 faults/s 增加,通常意味着工作集超出内存或索引缺失导致磁盘读放大。四 图形化与长期监控
五 关键指标与告警阈值示例
| 指标 | 含义 | 建议关注 | 告警示例 |
|---|---|---|---|
| connections.current / connections.available | 当前/可用连接数 | 连接数接近上限 | 使用率 > 80% |
| opcounters.insert/query/update/delete | 每秒操作数 | 突增或异常下降 | 5 分钟内增幅 > 50% |
| faults/s | 页面错误/秒 | 持续大于 0 且升高 | 持续 > 100 或持续上升 |
| res / vsize / mapped(mongostat) | 物理/虚拟内存与映射 | res 接近物理内存 | res > 物理内存 90% |
| q r w 队列(mongostat) | 总/读/写队列长度 | 队列长期不为 0 | 任一队列 > 10 持续 1 分钟 |
| backgroundFlushing(serverStatus) | 后台 fsync | flush 频繁或耗时变长 | 平均 flush 时间突增 |
| iowait / util(iostat) | 磁盘等待与利用率 | 高 iowait、util 接近 100% | util > 80% 持续 5 分钟 |