Ubuntu下MongoDB的性能调优技巧
小樊
40
2025-12-28 12:16:00
Ubuntu下MongoDB性能调优要点
一 硬件与操作系统基础
- 优先选用SSD/NVMe,显著降低I/O延迟;避免使用HDD。
- 为热点数据预留充足内存,WiredTiger以内存缓存数据/索引,数据量大时应配置更大内存。
- 选择多核CPU以支撑并发请求。
- 文件系统建议XFS(WiredTiger表现更佳)或ext4;避免使用FAT32/NTFS。
- 挂载选项添加noatime,减少元数据更新开销。
- 关闭不必要的系统服务(如ufw)与SELinux,降低干扰。
- 调整内核与资源:
- 降低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或更高),避免主从同步受限。
三 索引与查询优化
- 索引类型与创建:按场景选择单字段、复合、文本、2dsphere/2d、哈希索引;必要时使用background创建避免阻塞。
- 复合索引顺序:遵循等值条件 → 排序 → 范围,确保排序与范围能复用索引。
- 覆盖索引:将查询与投影字段全部纳入索引,避免回表(如只返回索引字段)。
- 查询计划与慢查询:用**explain(“executionStats”)**检查是否命中索引、扫描量与执行时间;配合慢查询日志定位瓶颈。
- 查询写法:使用limit()/projection减少传输;分页建议基于索引键或游标优化;避免**$where**、前导通配**$regex等难以走索引的操作;批量写入优先insertMany/updateMany**。
四 复制集分片与高可用
- 复制集:至少3节点(1主2从),配置replSetName并初始化;读压力大时可使用readPreference: secondary做读写分离。
- 分片:数据量达TB级时使用分片;选择高基数、低变更字段作分片键,避免数据倾斜;按需配置sh.addShard / sh.enableSharding / sh.shardCollection。
五 监控维护与验证
- 实时监控:使用mongostat(吞吐、延迟、连接等)与mongotop(集合级耗时)快速定位问题;长期可接入PMM或Prometheus+Grafana。
- 配置生效与验证:修改**/etc/mongod.conf后重启服务(如sudo systemctl restart mongod**);通过db.serverStatus().mem或db.serverStatus().wiredTiger.cache校验内存/缓存指标。
- 索引维护:定期审计与清理低效/冗余索引;大量更新/删除后可在维护窗口执行reIndex降低碎片;批量导入前可临时移除非必要索引后重建。
- 版本与备份:定期升级至稳定版本获取性能修复;使用mongodump/mongorestore做好备份。