Ubuntu系统下MongoDB性能优化与调优的关键要点

一 硬件与操作系统基础
- 优先采用SSD/NVMe存储,可显著降低磁盘I/O延迟;尽量避免使用性能较低的HDD。
- 为高频访问的热点数据预留足够内存,WiredTiger会使用内存缓存数据和索引,当数据规模较大时应适当增加内存配置。
- 选择多核CPU,更有利于支撑MongoDB在高并发场景下的请求处理能力。
- 文件系统建议使用XFS(通常更适合WiredTiger)或ext4;不建议使用FAT32/NTFS。
- 挂载参数建议添加noatime,以减少文件元数据更新带来的额外开销。
- 关闭不必要的系统服务(如ufw)以及SELinux,减少对MongoDB性能的额外干扰。
- 调整内核与系统资源:
- 适当降低vm.swappiness(如10–30),减少内存换页;必要时可配置适量Swap作为补充。
- 禁用透明大页(THP),降低内存管理带来的性能损耗。
- 提高资源限制(如ulimit -n / -u),避免文件句柄、连接数或进程数成为瓶颈。
二、MongoDB配置调优
- 存储引擎与缓存:建议使用WiredTiger,并将storage.wiredTiger.engineConfig.cacheSizeGB设置为物理内存的50%–70%(例如16GB内存可配置为8GB),避免占用过多系统可用内存。
- 慢查询与日志:开启operationProfiling(如mode: slowOp,slowOpThresholdMs: 100);在生产环境中,systemLog.verbosity通常建议设置为1,排障时可临时提高日志级别。
- 网络与连接:根据业务并发量调整net.maxIncomingConnections(如1000),避免连接过多引发资源竞争和上下文切换开销。
- 持久化与提交:保持journal.enabled: true;在写入密集型场景中,可适当调大journal.commitIntervalMs(如100ms),通过批量提交提升整体吞吐量。
- 副本集:合理设置oplogSizeMB(如高频写入环境可设为2048MB或更高),避免因oplog过小影响主从复制与同步效率。
三 索引与查询优化
- 索引类型与创建:根据业务场景选择单字段、复合、文本、2dsphere/2d、哈希索引;必要时可使用background方式创建索引,以减少对线上业务的阻塞影响。
- 复合索引顺序:建议遵循等值条件 → 排序 → 范围的设计原则,确保排序和范围查询能够尽量复用同一索引。
- 覆盖索引:将查询字段和投影字段全部纳入索引,尽量避免回表,提高MongoDB查询性能(例如仅返回索引中的字段)。
- 查询计划与慢查询:使用**explain(“executionStats”)**检查是否命中索引、扫描文档数量以及执行时间,并结合慢查询日志定位数据库性能瓶颈。
- 查询写法:使用limit()/projection减少无效数据传输;分页推荐基于索引键或游标进行优化;避免**$where**、前导通配**$regex等难以利用索引的操作;批量写入优先采用insertMany/updateMany**。
四 复制集分片与高可用
- 复制集:建议至少部署3个节点(1主2从),配置replSetName并完成初始化;在读压力较大的场景下,可通过readPreference: secondary实现读写分离。
- 分片:当数据规模增长到TB级时可考虑使用分片;优先选择高基数、低变更字段作为分片键,避免出现数据倾斜;按需配置sh.addShard / sh.enableSharding / sh.shardCollection。
五 监控维护与验证
- 实时监控:使用mongostat监控吞吐、延迟、连接数等关键指标,结合mongotop查看集合级耗时,快速定位MongoDB性能问题;长期监控可接入PMM或Prometheus+Grafana。
- 配置生效与验证:修改**/etc/mongod.conf后重启服务(如sudo systemctl restart mongod**);通过db.serverStatus().mem或db.serverStatus().wiredTiger.cache检查内存与缓存相关指标是否符合预期。
- 索引维护:定期审计并清理低效/冗余索引;在大量更新或删除后,可于维护窗口执行reIndex以降低索引碎片;批量导入数据前可临时移除非必要索引,完成后再重建。
- 版本与备份:定期升级到稳定版本,以获得性能修复和优化;同时结合mongodump/mongorestore做好数据库备份与恢复准备。
