Ubuntu 上 MongoDB 性能监控与调优实战
一 监控体系与工具
- 内置工具与命令
- 实时资源与负载:mongostat(连接、操作、页错误、锁等)、mongotop(按集合读写耗时)。
- 细粒度状态:db.serverStatus()、db.collection.stats()、rs.status()、sh.status()。
- 慢查询与剖析:开启 operationProfiling(如 mode: slowOp, slowOpThresholdMs: 100),或用 db.system.profile 分析。
- 图形化与托管
- MongoDB Compass(可视化执行计划、索引与性能页)、MongoDB Cloud Manager(监控、备份、告警)。
- 自建可观测性
- Prometheus + MongoDB Exporter + Grafana:Exporter 默认暴露 9216 端口,Prometheus 抓取后,在 Grafana 中可视化如连接数、每秒操作数、数据库大小等指标。
二 关键监控指标与告警阈值
- 连接与队列
- 关注 connections.current / connections.available,接近上限需扩容或优化连接池;出现大量排队/超时,检查慢查询与索引。
- 操作与延迟
- 用 mongostat 观察 insert/update/query/delete 的速率与 qr/qw(读/写队列);结合慢查询定位高延迟来源。
- 复制与回放
- 副本集关注 replication lag(主从延迟),复制停滞或延迟飙升常见于 oplog 不足、慢写入、网络抖动。
- 存储与缓存
- WiredTiger cache 命中率、page faults、journal/fsync 延迟;命中率低或 page faults 高,考虑增大内存或优化索引/工作集。
- 事务与游标
- 事务超时(transactionLifetimeLimitSeconds)、游标超时(cursorTimeoutMillis)频繁出现,需优化长事务与游标使用。
三 配置与参数调优
- 内存与缓存
- WiredTiger 引擎缓存:设置 storage.wiredTiger.engineConfig.cacheSizeGB。单机单实例可预留系统内存的**70%–80%给 MongoDB;多实例或与其他服务混部时按配额约60%**配置,避免 OOM 与抖动。
- 慢查询与剖析
- 生产建议维持 operationProfiling.mode: off,依赖慢日志即可;必要时短时开启并设 operationProfiling.slowOpThresholdMs 略高于核心查询 P95,避免日志噪音与性能退化。
- 复制与 oplog
- oplogSizeMB 默认约为磁盘的10%,一般无需调小;若业务“小数据高频更新”,建议调大以确保 oplog 至少覆盖≥1小时。如使用云托管,通常通过专用命令调整 oplog 大小。
- 流控与复制
- 出现受 flowControl 影响的长尾写入(如慢日志中 flowControl.timeAcquiringMicros 接近 durationMillis),可适当调大 setParameter.flowControlTargetLagSeconds,并进一步排查主从同步瓶颈。
- 事务与游标
- 避免长事务:可将 transactionLifetimeLimitSeconds 调小至 30s 并拆分事务;游标及时关闭,必要时将 cursorTimeoutMillis 适度调小(如 300000ms)降低资源占用。
- 系统层面
- 提高文件描述符与进程数限制(如 nofile 1048576),降低栈大小(如 ulimit -s 1024);关闭 Transparent Huge Pages(THP) 以减少内存管理抖动。
四 查询与索引优化
- 索引策略
- 为高频查询条件建立合适的单字段/复合索引,避免全表扫描;用 explain(“executionStats”) 验证索引命中与扫描方式;定期清理无用索引,必要时 reIndex()。
- 查询写法
- 只返回必要字段(投影),分页用 limit/skip 或基于游标的方案,避免大偏移;聚合管道可合并多步操作减少往返。
- 批量与写入
- 高吞吐写入优先使用 批量插入(insertMany) 与合理批次大小;在副本集/分片场景结合 Write Concern 与业务容忍度平衡一致性与延迟。
五 快速排障与优化清单
- 发现慢查询
- 先用 mongotop 定位热点集合,再用 db.collection.find(…).explain(“executionStats”) 与慢日志确认是否缺少索引或存在全表扫描。
- 复制延迟
- 检查 rs.printSlaveReplicationInfo()、网络抖动、磁盘/负载;高频小更新场景适当增大 oplogSizeMB,并优化慢写入与索引。
- 连接数打满
- 核查应用连接池配置与泄漏;提升 net.maxIncomingConnections 上限并确保 ulimit -n 足够;优化长事务与慢查询释放连接。
- 高延迟与抖动
- 关注慢日志中的 flowControl 字段;适度调大 flowControlTargetLagSeconds 并排查主从同步瓶颈;必要时升级实例规格或优化写入路径。
- 监控落地
- 建议同时启用:内置工具(日常巡检)、Compass/Cloud Manager(可视化与告警)、自建 Prometheus+Exporter+Grafana(长期趋势与容量规划)。