Linux环境下 MongoDB 性能调优指南
一 系统层优化
- 存储与文件系统
- 使用SSD/NVMe,优先XFS/Ext4;在 /etc/fstab 中为数据盘添加noatime以减少元数据写入;对机械盘或虚拟化环境,将readahead调小(如32)以适配随机访问;RAID 场景优先RAID10提升吞吐与可靠性。
- 内存与虚拟内存
- 适度降低vm.swappiness(如 10)以减少换页;在容器/虚拟化或内存紧张环境可设vm.overcommit_memory=2降低内存超卖风险;避免系统主动压缩内存页(如 zswap/透明压缩)以免增加 CPU 抖动。
- 透明大页与 NUMA
- 禁用透明大页(THP):echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled;在NUMA主机上建议启用numactl --interleave=all启动 mongod,缓解跨 NUMA 访问延迟。
- 文件描述符与进程限制
- 提升ulimit -n/-u(如64000)并写入 /etc/security/limits.conf 与 systemd 服务 LimitNOFILE/LimitNPROC,避免“too many open files”。
- 时间与时钟
- 部署NTP保证复制集/分片集群节点间时钟同步,避免选举与 oplog 回放异常。
二 MongoDB 配置优化
- 存储引擎与缓存
- WiredTiger 缓存默认约为min(50%×内存 - 1GB, 256MB);一般可按系统内存的40%–60%配置 storage.wiredTiger.engineConfig.cacheSizeGB,容器/共享环境需显式限制;通过 serverStatus().wiredTiger.cache 观察bytes currently in the cache是否长期接近上限来判断是否扩容。
- 压缩与目录隔离
- collectionConfig.blockCompressor 选择:snappy(CPU 低、通用)、zstd(压缩率更高、解压快)、zlib(压缩率高、CPU 高)、none(不可压缩数据如图片/视频);索引与数据 I/O 分离用storage.wiredTiger.engineConfig.directoryForIndexes(多盘收益明显);多库隔离用storage.directoryPerDB(便于 I/O 与容量管理)。
- 网络与连接
- 结合业务并发与实例规格设置net.maxIncomingConnections,避免过大连接数导致上下文切换与内存压力;合理规划应用连接池与超时,减少短连接风暴。
- 日志与诊断
- 启用operationProfiling记录慢查询,配合 systemLog 与 logRotate 控制日志体积;使用mongostat / mongotop做实时体检,必要时引入 PMM 等监控。
示例 YAML 片段(仅展示关键项):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
directoryForIndexes: true
collectionConfig:
blockCompressor: snappy
directoryPerDB: true
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 10000
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
三 索引与查询优化
- 索引设计
- 为高频查询路径建立单字段/复合索引,遵循“等值在前、范围在后”,排序字段前置可避免额外排序;尽量构建覆盖索引以减少回表;删除冗余/低效索引降低写入与存储开销。
- 执行计划与诊断
- 使用**explain(“executionStats”)识别 COLLSCAN、低效排序与键扫描量;必要时用hint()**验证索引有效性(谨慎使用,避免误用)。
- 慢查询治理
- 通过profiling与日志定位 TOP N 慢查询,优化过滤、排序、聚合管道与投影,减少totalDocsExamined / totalKeysExamined与内存占用。
四 架构与扩展
- 高可用与读扩展
- 采用副本集保障高可用与读扩展;合理设置读偏好(如 secondaryPreferred)以分担热点读。
- 横向扩展
- 数据量大或写入吞吐高时引入分片,按分片键均衡数据分布,避免热点与跨分片聚合。
- 批量与写入策略
- 使用批量写入(bulk insert/update)降低往返与锁竞争;结合writeConcern / journal在一致性与性能间取得平衡。
五 监控 压测与变更流程
- 监控与巡检
- 持续观察mongostat / mongotop、WiredTiger 缓存命中、连接数、慢查询与磁盘/CPU/内存;必要时引入PMM等可视化监控。
- 基准测试与容量评估
- 以真实流量或回放进行压测,验证索引/参数/硬件改动收益;结合工作集大小与增长趋势规划cacheSizeGB、磁盘与节点规模。
- 安全变更
- 任何参数调整先在测试环境验证,变更窗口内滚动升级并保留回滚方案;重要操作前做好备份(如 mongodump)。