Ubuntu MongoDB性能瓶颈如何排查
导读:Ubuntu 上 MongoDB 性能瓶颈排查路线图 一 快速定位瓶颈类型 先用系统工具判断是 CPU、内存、磁盘 IO、网络 哪一环异常: CPU/负载:top、htop;关注 load average 与用户态/系统态占比。 内存与...
Ubuntu 上 MongoDB 性能瓶颈排查路线图
一 快速定位瓶颈类型
- 先用系统工具判断是 CPU、内存、磁盘 IO、网络 哪一环异常:
- CPU/负载:top、htop;关注 load average 与用户态/系统态占比。
- 内存与换页:free -m、vmstat 1;关注 swap 与 page faults/s。
- 磁盘 IO:iostat -x 1;关注 await、r/s、w/s、util%,util 持续接近 100% 多为 IO 饱和。
- 网络:iftop、nload;关注 带宽占用 与 丢包/重传。
- 再用 MongoDB 自带工具看数据库维度:
- mongostat:关注 inserts/s、queries/s、updates/s、deletes/s、getmore/s、command/s、flushes/s、mapped、res、faults/s、locked%、idx miss%、q/r/w 队列、conn。其中 faults/s 高说明内存不足导致换页,idx miss% 高说明索引缺失或低效,locked% 高说明写冲突或锁争用,q/r/w 队列升高说明并发压力。
- mongotop:按集合观察 读写耗时,快速找出“热点集合”。
- 若观察到 网络带宽打满(如 TX/RX 接近网卡上限),常见于 mongos 单点承载大流量,可通过增加 mongos 实例并做连接负载均衡缓解。
二 日志与慢查询定位
- 检查 MongoDB 服务与日志路径:
- 服务状态:systemctl status mongod
- 日志位置:/var/log/mongodb/mongod.log(Ubuntu 常见路径)
- 实时观察与过滤:
- tail -f /var/log/mongodb/mongod.log
- 提取错误:grep -E ‘E|F’ /var/log/mongodb/mongod.log
- 日志轮转:use admin; db.runCommand({ logRotate: 1 } )
- 慢查询与 Profiling:
- 配置阈值(mongod.conf):
- systemLog: destination: file; path: /var/log/mongodb/mongod.log; logAppend: true
- operationProfiling: slowOpThresholdMs: 100; mode: all
- 或在会话中开启:
- db.setProfilingLevel(2, 100)
- db.system.profile.find().sort({ $natural: -1} ).limit(20)
- 配置阈值(mongod.conf):
- 分析执行计划(explain):
- db.collection.find({ age: { $gt: 30} } ).explain(“executionStats”)
- 关注:winningPlan.stage 是否为 COLLSCAN(全表扫描需加索引)、executionStats.executionTimeMillis、totalKeysExamined、totalDocsExamined。
- 典型异常日志模式与处置要点:
- 连接风暴/文件描述符不足:Too many open files → 检查 ulimit -n,在 /etc/security/limits.conf 提升:mongod soft/hard nofile 64000。
- 查询无索引:planSummary: COLLSCAN、keysExamined:0 → 建立合适索引(如 { age:1} )。
- 副本集心跳异常:REPL heartbeat failed → 检查网络连通性与副本集状态,必要时重同步并检查 Oplog 窗口。
- 存储引擎错误:WiredTiger error → 用 db.serverStatus().storageEngine 核查引擎状态,必要时 mongod --repair(谨慎,先备份)。
三 索引与查询优化
- 为高频 filter/sort/projection 建立复合索引,避免 COLLSCAN;用 explain 验证索引命中与扫描量。
- 排序方向需与索引一致;例如索引 { country: -1, city: -1} 可支持 sort { country: -1, city: -1} ,但不支持 { country: -1, city: 1} ,需建立匹配索引或改写排序。
- 控制返回字段(projection),减少网络与内存开销;分页避免深翻页(结合 _id 或 时间戳 游标)。
- 合理设置 慢查询阈值(如 100ms),先抓“最慢”再逐步收敛阈值;优化后回归验证执行时间与扫描量是否下降。
四 配置与资源调优
- WiredTiger 缓存:在 mongod.conf 设置 storage.wiredTiger.engineConfig.cacheSizeGB,通常将可用内存的 70%–80% 分配给缓存(结合实例角色与系统其余服务留出余量)。
- 连接与队列:根据业务峰值调整 net.maxIncomingConnections,避免连接风暴;结合 mongostat 的 q/r/w 队列与 conn 观察压力。
- 存储与文件系统:优先 SSD、合理的 RAID 10;减少文档体积、启用压缩可降低 IO。
- 副本集/分片:检查 oplog 窗口 与同步延迟;分片场景注意 mongos 负载均衡,必要时横向扩展 mongos 实例。
五 监控与长期观测
- 短期用 mongostat/mongotop/db.serverStatus()/db.system.profile 快速定位;长期建议引入 PMM、MongoDB Cloud Manager/Ops Manager、Datadog、Prometheus+Grafana 做历史趋势、可视化与告警。
- 关键告警示例:
- 磁盘 util% 持续接近 100%
- faults/s 明显升高(内存不足/换页)
- idx miss% 高企(索引缺失/低效)
- locked% 高或 q/r/w 队列长期不为 0(并发争用)
- 慢查询数量与 P95/P99 延迟持续上升
- 建议以“资源指标 → 数据库指标 → 语句级指标”的三层看板持续观测,并结合变更窗口做 A/B 验证优化成效。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu MongoDB性能瓶颈如何排查
本文地址: https://pptw.com/jishu/762472.html
