Debian 上 MongoDB 性能优化实战指南
一 系统层优化
- 使用64位系统与 MongoDB 包,启用更大的内存映射文件以支撑大数据库工作集。
- 优先选择SSD/NVMe,必要时使用RAID提升吞吐与可靠性。
- 保障充足内存,让热点数据尽量留在内存;避免过度换页。
- 适度配置 Swap 并调优内核参数(如 vm.swappiness),在内存紧张时避免剧烈抖动。
- 精简系统负载,关闭不必要的服务与定时任务,减少资源争用。
- 持续监控资源:用 free -m、iostat、vmstat 观察内存与磁盘 I/O 状况。
二 存储引擎与关键配置
- 存储引擎建议使用 WiredTiger;在 /etc/mongod.conf 中按内存与实例角色设置 storage.wiredTiger.engineConfig.cacheSizeGB,避免与其他进程争用内存。
- 合理设置 net.maxIncomingConnections(最大连接数),匹配应用并发与内核/文件句柄上限。
- 启用日志与慢查询分析:配置 systemLog.destination/file/path,并按需调整 operationProfiling(如 profile=1、slowms=200)定位问题查询。
- 典型配置片段(示例值,需结合实例规格调整):
- storage.wiredTiger.engineConfig.cacheSizeGB: 物理内存的约50%–60%(留出空间给操作系统与其他进程)
- net.maxIncomingConnections: 依据并发连接与 ulimit -n 规划
- operationProfiling: profile=1, slowms=200
- systemLog: destination=file, path=/var/log/mongodb/mongod.log, logAppend=true
- 修改关键参数后需重启以使生效。
三 索引与查询优化
- 为高频查询路径建立单字段与复合索引,避免全表扫描。
- 优先使用覆盖索引(查询字段全部包含在索引中),减少回表。
- 控制返回数据量:使用 limit() 与投影仅返回必要字段。
- 使用 explain(“executionStats”) 分析执行计划,关注 nscanned、nreturned、是否 IXSCAN/COLLSCAN、以及 scanAndOrder 等关键信息。
- 避免全表更新与无索引排序;必要时拆分大事务、减少锁竞争。
- 定期清理/重建低效或碎片化的索引,保持查询性能稳定。
四 架构扩展与高可用
- 读写分离:利用副本集的secondary节点承载读流量,减轻主节点压力。
- 水平扩展:当数据量与并发持续增长时引入分片集群,按分片键均衡数据与负载。
- 结合业务特点选择分片键,避免热点与跨分片聚合。
五 监控维护与变更流程
- 实时监控:使用 mongostat、mongotop 观察 QPS、连接、锁、I/O 等;必要时引入 PMM 等第三方监控。
- 慢查询定位:通过 systemLog 与 Profiling 发现长耗时操作,配合 explain 迭代优化。
- 日志管理:必要时执行 logRotate 轮转大日志,便于分析与归档。
- 变更流程:先在测试环境验证参数与索引变更,再灰度/滚动上线,变更后复核监控指标。
- 日常维护:定期备份(如 mongodump/mongorestore)、升级至稳定版本获取性能修复与改进。