Ubuntu 下 MongoDB 常见性能瓶颈与定位路径
一 常见瓶颈概览
- 磁盘 IO 与存储引擎:WiredTiger 的写放大、检查点、压缩与缓存命中率直接决定吞吐与延迟;机械盘或容量接近满盘时尤为明显。
- CPU:文档解析、聚合管道、索引构建、压缩/解压等计算密集场景会吃满 CPU;单条 insert_one 高并发小文档时常见 CPU 先到顶。
- 网络:跨机写入/导出导入、分片集群的 mongos 集中转发、带宽不足或连接风暴都会成为上限。
- 索引与查询设计:缺失索引导致 COLLSCAN、超大排序/分组、返回过量字段都会放大 IO 与 CPU 消耗。
- 连接与系统限制:文件描述符上限、连接风暴、透明大页(THP)等系统层面问题会限制并发与稳定性。
- 复制与锁争用:旧版本或特定工作负载下的全局锁、oplog 窗口不足、回放落后会拖慢写入与读取一致性。
二 快速定位步骤
- 看日志定位异常与慢操作:
- Ubuntu 默认日志路径:/var/log/mongodb/mongod.log。
- 关注关键词:COLLSCAN、keysExamined/docsExamined、COMMAND … ms、Too many open files、WiredTiger error。
- 动态观测:tail -f /var/log/mongodb/mongod.log;必要时调整慢查询阈值(如 slowMS=100)或开启 profiling 做细粒度分析。
- 用内置工具看资源与负载:
- mongostat(连接、插入/更新/查询速率、page faults、flushes、qr/qw 等)与 mongotop(按库/集合的读写耗时)快速识别热点与队列。
- 检查系统资源与限制:
- 资源:top/vmstat/iostat/iftop 分别观察 CPU、内存、磁盘 IO、网络带宽。
- 限制:ulimit -n、/etc/security/limits.conf 的 nofile/nproc,以及 systemd 服务单元的 LimitNOFILE/LimitNPROC。
- 验证索引与查询计划:
- 对慢查询使用 explain(“executionStats”),确保有合适索引、避免 COLLSCAN、减少 returned 字段与排序/分组成本。
- 检查存储引擎状态:
- db.serverStatus().storageEngine 查看 WiredTiger 状态与错误;必要时按流程修复或重建。
三 典型症状与对应瓶颈
| 症状 |
高概率瓶颈 |
快速验证 |
处理要点 |
| 插入/更新速率上不去,CPU 接近 100% |
文档解析、单线程批量/并发策略不当 |
mongostat 看 insert 与 faults;应用侧改用批量写入 |
使用批量写入(Bulk API)、合并小文档、优化驱动并发与批次大小 |
| 查询很慢,日志出现 COLLSCAN |
缺失或低效索引 |
explain 显示 keysExamined 接近 docsExamined |
建立复合索引、覆盖查询、减少返回字段与排序 |
| 高并发下吞吐不升反降 |
旧版本全局锁、连接风暴 |
连接数猛增、队列堆积 |
升级版本、限流与连接池、调大 maxIncomingConnections |
| 跨机导入/导出或分片路由很慢 |
网络带宽/时延、mongos 单点 |
iftop 观测带宽、mongostat 看 qr/qw |
多 mongos 负载均衡、压缩传输、就近路由 |
| 日志报 “Too many open files” |
文件描述符上限过低 |
ulimit -n、/var/log/mongodb/mongod.log 告警 |
limits.conf 与 systemd 调高 nofile,滚动重启 |
| 写入抖动、检查点频繁 |
磁盘 IO 饱和、WiredTiger 缓存不足 |
iostat 高 await、%util≈100% |
升级 SSD/NVMe、调大 wiredTiger cacheSizeGB、控制脏页比例 |
| 副本集延迟、回放落后 |
oplog 窗口不足、磁盘/网络慢 |
rs.printReplicationInfo()、rs.printSlaveReplicationInfo() |
扩容 oplog、优化磁盘与网络、减少大事务/批量写入峰值 |
四 Ubuntu 上的优化要点
- 存储与缓存:
- 使用 SSD/NVMe,为 WiredTiger 设置合理 cacheSizeGB(通常不超过物理内存的 50%~60%),避免与页面缓存“打架”。
- 连接与系统资源:
- 在 limits.conf 与 systemd 中提升 nofile/nproc,避免连接风暴;按需调整 net.maxIncomingConnections。
- 透明大页 THP:
- 禁用 THP(创建 systemd 服务设置 /sys/kernel/mm/transparent_hugepage/enabled 与 defrag 为 never),减少内存管理抖动。
- 索引与查询:
- 为高频查询路径建立复合索引与覆盖索引,避免无索引排序/分组,减少返回字段;用慢查询日志与 profiling 持续验证。
- 部署与拓扑:
- 读写分离、分片扩展;为分片集群部署多个 mongos 做负载均衡,避免单 mongos 带宽成为瓶颈。
- 驱动与批量:
- 应用侧使用批量写入、合理并发与批次大小,减少往返与网络小包开销。