MongoDB 在 CentOS 的常见性能瓶颈与定位路径
一 常见瓶颈概览
二 快速定位步骤
db.serverStatus(),关注 mem.resident(常驻内存)与数据/索引规模;若工作集明显大于内存,瓶颈多在磁盘。mongostat 观察 insert/query/update/delete、getmore、flushes、dirty、used、net_in/net_out;持续高 flushes/dirty 指向磁盘;高 net_in/out 指向网络。top/htop、iostat -x 1(关注 await、r/s、w/s、svctm、util)、vmstat 1(关注 si/so、wa)、mpstat -P ALL 1(看多核是否均衡)。db.setProfilingLevel(1, { slowms: 100 }),用 explain("executionStats") 检查是否走索引、扫描文档数与排序是否在内存中完成。sar -n DEV 1、/proc/interrupts;若某核软中断长期 100%,网络栈与 RPS 配置需优化。ss -s、ulimit -n、cat /proc/sys/fs/file-nr;连接暴增而句柄不足,会在连接建立与调度上排队。三 典型场景与瓶颈对照表
| 场景 | 主要瓶颈 | 关键信号 | 优先动作 |
|---|---|---|---|
| 工作集 > 内存 | 磁盘 I/O(WiredTiger 回写、checkpoint) | iostat 高 await/util、mongostat 高 flushes/dirty |
增加内存;优化索引与工作集;使用 SSD;适度调大 storage.wiredTiger.engineConfig.cacheSizeGB |
| 高并发点查/小文档 | CPU 与网络 | top CPU 接近 100%;mongostat 高 net_in/net_out;mpstat 单核软中断打满 |
开启 RPS 分散软中断;优化索引与投影;考虑 网络压缩;必要时扩容 CPU/实例 |
| 跨分片无片键查询 | mongos 与网络聚合 | mongostat 在 mongos 上高 net_in;查询耗时长 |
优化片键与查询路由;减少广播;在 mongos 前做请求合并/限流 |
| 写入密集/事务多 | 磁盘 fsync 与 journal | iostat 写延迟高;mongostat 高 **insert` 与 flushes |
使用 SSD 与带 BBU 的 RAID 写缓存;适度提高 commitIntervalMs(权衡持久性);合理设置 oplog 大小 |
| 大文档/无投影与分页 | 网络与 CPU | 响应时间随文档增大而陡增;mongostat 高 net_out |
使用 投影 只返回必要字段;分页/游标 控制批量;拆分大文档 |
| 连接数过多 | 内存与调度 | ulimit -n 触顶;ss -s 连接数巨大;top 负载高但 QPS 不升 |
提升 文件描述符/进程数 上限;连接池复用;优化应用并发模型 |
四 关键调优要点
storage.wiredTiger.engineConfig.cacheSizeGB 结合内存与实例角色设置;优先 SSD;RAID 配置写缓存与电池保护;必要时调整 I/O 调度器。kernel.sched_min_granularity_ns、kernel.sched_wakeup_granularity_ns);提升 文件描述符/进程数 限制(如 100000+);为 dbPath 挂载高性能块设备。$or、全表扫描与在大集合上做无必要的排序/聚合;用 explain() 持续验证执行计划。