MongoDB 性能调优在 Debian 上的实用方法
一 系统层优化
- 使用64位内核与MongoDB,支持更大的内存映射文件,避免大库场景下的地址空间受限。
- 关闭或禁用NUMA与Transparent Hugepage(THP),减少内存访问延迟与抖动:
- GRUB 启动参数示例:GRUB_CMDLINE_LINUX_DEFAULT=“quiet numa=off transparent_hugepage=never”,执行 sudo update-grub 并重启;
- 运行时写入:echo never > /sys/kernel/mm/transparent_hugepage/enabled 与 /sys/kernel/mm/transparent_hugepage/defrag。
- 选用高性能存储(NVMe SSD)与合理的RAID级别,提升IOPS与可靠性。
- 精简系统负载:关闭不必要的服务与定时任务,避免与数据库争用CPU/IO。
- 保持内核与驱动、文件系统(如 ext4/xfs)为稳定新版本,减少I/O栈瓶颈。
二 存储引擎与内存配置
- 使用WiredTiger存储引擎,合理设置cacheSizeGB(例如:总内存的约50%,需为操作系统与其他进程预留充足内存),避免内存争用导致换页。
- 确保journal.enabled: true,保障崩溃后的快速恢复与写一致性。
- 将dbPath指向高性能磁盘(如本地NVMe),并分离日志、数据、临时目录(若业务允许)以降低I/O争用。
- 预分配磁盘空间与合理设置文件系统挂载选项(如 noatime),减少元数据与写放大。
三 索引与查询优化
- 为高频查询路径建立单字段与复合索引,优先使用覆盖索引以减少回表。
- 使用**explain(“executionStats”)**分析执行计划,关注 nscanned、nreturned、executionTimeMillis、是否使用索引与是否发生 scanAndOrder。
- 精简查询与投影(只返回必要字段),避免 SELECT *;谨慎使用 $where、正则前缀缺失等易全表扫描的写法。
- 避免全表更新/大批量无批处理更新,拆分为小批次并配合有序写入与重试。
- 开启慢查询分析(Profiling):
- 级别 0 关闭;1 记录慢查询(默认阈值100ms);2 记录全部;
- 示例:db.setProfilingLevel(1, 200) 将阈值设为200ms;
- 使用 db.system.profile 分析热点操作,必要时重建低效索引(reIndex)。
四 网络与连接、部署架构
- 在 /etc/mongod.conf 中合理设置:
- net.bindIp 仅监听必要地址;
- net.maxIncomingConnections 结合应用并发与连接池上限配置,避免连接风暴。
- 启用副本集提升读可用性与故障切换能力;数据规模与并发进一步增长时引入分片,实现水平扩展。
- 保持驱动与服务器版本匹配,及时升级稳定版以获得性能修复与新特性。
五 监控、日志与变更流程
- 使用 mongostat / mongotop 实时观察 QPS、连接、锁、I/O 等关键指标;必要时引入 PMM 等可视化监控。
- 关注 mongod.log 中的慢操作(默认记录超过100ms的命令),必要时调整日志级别与轮转策略(如 logRotate)。
- 变更流程:先在测试环境验证参数与索引改动;变更后使用基准测试与监控对比吞吐、P95/P99 延迟与错误率;对生产变更采用滚动/蓝绿方式,控制回滚窗口。