Linux 环境下 MongoDB 调优指南
一 系统层优化
- 文件描述符与进程数:将软/硬限制提升到高值(如 nofile 1048576、nproc 524288),持久化到 /etc/security/limits.conf,并确认 systemd 服务段包含 LimitNOFILE=1048576 等,避免 “too many open files”。示例:
- 透明大页 THP:MongoDB 对小随机 I/O 不友好,建议关闭:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
可加入开机启动脚本确保持久化生效。
- 文件系统与挂载:WiredTiger 场景优先 XFS;挂载参数建议使用 noatime,nodiratime 减少元数据开销。示例 /etc/fstab:
/dev/xvdb /data xfs defaults,noatime,nodiratime 0 0
- 磁盘预读 readahead:MongoDB 多为随机访问,建议将预读调小(如 32 扇区),降低无效预读带来的抖动:
sudo blockdev --setra 32 /dev/xvdb
- NUMA 架构:在 NUMA 主机上建议禁用或启用 numactl --interleave=all 运行 mongod,避免跨 NUMA 访问性能劣化。
- 时间同步:副本集/分片依赖稳定的时钟,务必启用 NTP 服务进行校时,避免选举与 oplog 回放异常。
二 MongoDB 配置优化
- 存储引擎缓存 WiredTiger:合理设置 storage.wiredTiger.engineConfig.cacheSizeGB,默认约为 min(50%×内存 - 1GB, 256MB)。一般让缓存覆盖业务的 工作集,在独占物理机时可考虑 40%–60% 系统内存;容器/共享环境需保守设置以避免 OOM。通过 db.serverStatus().wiredTiger.cache 观察
bytes currently in the cache、maximum bytes configured、pages read into cache 等指标判断是否需要调整。
- 数据压缩 blockCompressor:WiredTiger 列内压缩,权衡 CPU 与磁盘/网络 I/O。常用算法:snappy(默认,CPU 低)、zstd(压缩率高、解压快)、zlib(更高压缩率)、none(不可压缩数据如图片/视频)。写入密集优先 snappy;读取密集且存储紧张优先 zstd。
- 索引与数据分离:开启 storage.wiredTiger.engineConfig.directoryForIndexes 将索引与集合数据分目录存放,缓解 I/O 争用;多库场景可开启 storage.directoryPerDB 做 I/O 与运维隔离(更利于按库迁移/备份)。注意:该配置在实例初始化时设置更稳妥,存量实例变更需谨慎评估与迁移。
- 网络传输压缩:开启 net.compression.compressors(如 zstd,snappy,zlib),副本集/分片间及客户端与服务端通信可显著降低带宽占用与跨地域延迟;两端需至少共享一种算法才可生效。
示例 mongod.conf 片段(YAML):
storage:
dbPath: /data
wiredTiger:
engineConfig:
cacheSizeGB: 8
directoryForIndexes: true
collectionConfig:
blockCompressor: zstd
directoryPerDB: true
net:
port: 27017
bindIp: 0.0.0.0
compression:
compressors: zstd,snappy,zlib
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: rs0
三 索引与查询优化
四 监控与容量规划
- 内置工具与命令:
- mongostat:观察 insert/query/update/delete/getmore/command 速率、连接数、脏页与页面错误等,快速判断负载与健康度。
- mongotop:按集合维度查看读写耗时,定位热点集合与慢集合。
- db.serverStatus() / db.hostInfo():查看内存、连接、缓存命中、网络、WiredTiger 详细统计等,用于容量与瓶颈定位。
- 容量与扩展:
- 当单实例 工作集 超出缓存或磁盘/CPU 成为瓶颈时,引入 副本集 提升可用性与读扩展,使用 分片集群 做水平扩展与数据分布。
- 持续“监控—调整—验证”闭环,结合慢查询与缓存命中率变化评估每次参数/索引/架构调整收益。