CentOS 上 MongoDB 性能调优实战指南
一 硬件与操作系统层优化
- 使用 SSD/NVMe 替代 HDD,显著降低 I/O 延迟;为数据盘与日志盘分别挂载,避免 I/O 争用。
- 为数据盘挂载选项添加 noatime,减少元数据写入;示例:
/dev/xvdb /data ext4 noatime 0 0。
- 提升文件描述符与进程数限制(示例值,按业务调大):
ulimit -n 64000、ulimit -u 64000。
- 关闭 Transparent Huge Pages(THP),减少内存管理抖动;可通过 tuned 或 systemd 服务禁用。
- 调整 vm.swappiness=10、
vm.overcommit_memory=2,降低换页倾向并避免内存过度承诺。
- 磁盘调度器优先使用 noop/deadline(SSD 场景),减少不必要的寻道与合并。
- 副本集场景为 oplog 配置合理大小,通常预留磁盘空间的约 5%,并按数据量与变更频率评估。
以上措施能显著改善磁盘、内存与连接资源瓶颈,为数据库层优化奠定基础。
二 存储引擎与内存配置
- 使用 WiredTiger 作为默认存储引擎,启用压缩(如 snappy 或 zlib)以节省空间、适度增加 CPU 开销。
- 合理设置 WiredTiger 缓存:一般建议为服务器总内存的 50%–75%;在 mongod.conf 中配置:
storage.wiredTiger.engineConfig.cacheSizeGB: 。
- 调整 WiredTiger Journal 提交间隔(如
commitIntervalMs: 100),在持久性与吞吐之间取平衡。
- 启用日志轮转,避免 mongod.log 无限增长。
- 若需进一步约束内存占用,可在进程或容器层使用 cgroups 限制内存上限。
- 在部分版本中,可通过 tcmalloc 参数调节内存归还策略(如
tcmallocAggressiveMemoryDecommit、tcmallocReleaseRate),仅在明确收益时启用。
上述配置直接影响读写路径、检查点、页面回收与内存占用,是性能与稳定性的核心杠杆。
三 索引与查询优化
- 为高频查询路径建立 单键/复合/多键/文本/地理空间 索引;复合索引遵循 ESR 规则(Equality, Sort, Range),将等值条件放最左,排序字段居中,范围字段置右。
- 优先设计 覆盖查询(Covered Query),在索引中包含所有返回字段,并使
_id 要么排除、要么纳入索引。
- 使用
explain("executionStats") 分析执行计划,关注 COLLSCAN、IXSCAN、DocsExamined、KeysExamined、SORT 等关键指标,减少扫描与排序成本。
- 避免或改写低效模式:减少 $or、大范围无索引查询、无必要的排序与聚合;必要时用复合索引消除排序。
- 控制索引数量与顺序,去除 冗余/包含关系 导致的重复索引;高选择性字段优先索引。
- 读写分离:将报表/分析类读请求路由到 从节点,减轻主节点压力。
索引与查询优化是降低 CPU 与 I/O 的最快路径,应结合慢日志与执行计划持续迭代。
四 监控、诊断与架构扩展
- 使用 mongostat、mongotop 观察插入/查询/更新/删除速率、网络与磁盘活动;在 mongo shell 中执行
db.serverStatus() 获取内存、连接、磁盘等详细指标。
- 启用并分析 慢查询日志,聚焦扫描量与排序成本;必要时使用 **db.setProfilingLevel()` 与 profile 集合定位问题。
- 结合 Prometheus + Grafana 或 Zabbix 搭建可视化监控与告警,覆盖实例与系统层关键指标。
- 架构层面:读多写少场景使用 副本集读从;数据量大或写入吞吐高时按业务键选择 分片键 进行 水平扩展,避免热点与数据倾斜。
- 定期维护:清理无用数据、合并/重建碎片化严重的索引(如
reIndex),保持执行计划稳定。
持续监控与容量规划能及早发现瓶颈并验证优化成效,是生产环境的必备实践。
五 关键配置示例与注意事项
- 示例一(内存与压缩):
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 8
collectionConfig:
blockCompressor: snappy
journal:
enabled: true
commitIntervalMs: 100
- 示例二(慢查询阈值与日志轮转):在配置文件中设置
operationProfiling.slowOpThresholdMs 与 systemLog.logRotate,并配合外部 logrotate。
- 示例三(系统层关键项):
vm.swappiness=10、vm.overcommit_memory=2、禁用 THP、ulimit -n 64000。
- 注意事项:变更配置前务必 备份;先在 测试环境 验证;避免在生产库直接执行
reIndex,建议在维护窗口或迁移后重建;谨慎调整 Journal 提交间隔,过大会增加宕机数据丢失窗口。
这些示例与注意事项覆盖常见“能落地”的关键点,便于快速实施与风险控制。