MongoDB 在 CentOS 的性能配置与优化清单
一 硬件与操作系统优化
- 存储与文件系统:优先使用 SSD/NVMe,文件系统选择 XFS(CentOS 7 默认)或 EXT4;对数据库所在分区挂载参数加上 noatime,nodiratime 减少元数据写入;WiredTiger 推荐 readahead 0 或 16,MMAPv1 可用 32(示例:
blockdev --setra 16 /dev/sdX)。
- 内存与交换:将 vm.swappiness 调低(如 10)以减少换页;必要时将 vm.overcommit_memory 设为 2 降低内存过度承诺带来的抖动。
- 透明大页 THP:禁用 THP 以降低内存管理开销(见下方“关键参数与命令”)。
- 时间同步:部署 chrony 保证节点间时间一致,集群环境尤为重要。
- 资源限制:提升 文件描述符 与 进程数 上限(如 100000+),避免连接/文件瓶颈。
二 MongoDB 配置优化
- 存储引擎与缓存:WiredTiger 缓存默认约为 min(50%×内存−1GB, 256MB);在专用服务器上可手动设置 storage.wiredTiger.engineConfig.cacheSizeGB,通常预留 40%–60% 内存给系统与其他进程;写入密集且 CPU 充足时可考虑 zstd 压缩(默认 snappy)。
- 目录隔离:开启 storage.directoryPerDB 与(多盘时)storage.wiredTiger.engineConfig.directoryForIndexes,将数据与索引 I/O 分离,缓解读写争用。
- 日志与 WAL:启用 journal(生产强烈建议),并按需调整 storage.journal.commitIntervalMs(更高值降低提交频率、提升吞吐,但增加宕机数据丢失窗口)。
- 网络与连接:合理设置 net.maxIncomingConnections 与操作系统 ulimit -n;仅在内网开放端口,使用 bindIp 限制来源。
- 副本集/分片:大数据量或高并发场景使用 副本集 提升读可用性与冗余,使用 分片 水平扩展。
三 索引与查询优化
- 索引策略:为高频查询路径建立 单字段 与 复合索引,避免全表扫描;必要时使用 覆盖索引 减少回表;对范围/排序字段合理组织索引顺序。
- 查询写法:使用 投影 仅返回必要字段;大数据集分页建议使用 基于游标的分页(如
find().sort(...).limit(N) 结合上次游标值),避免深分页性能劣化;减少低效的 $or 与高成本聚合。
- 执行计划:用 explain() 与 db.getProfilingLevel()/profiling 定位慢查询,结合 索引命中率 与 扫描方式 持续优化。
- 维护:对高写入/更新负载的集合定期 reIndex 或使用 compact(谨慎评估锁与窗口期),清理无用数据降低碎片与扫描成本。
四 监控与维护
- 内置工具:使用 mongostat(吞吐、连接、锁等)与 mongotop(集合级读写耗时)做日常巡检;慢查询通过 profiling 与 日志 持续跟踪。
- 可视化与告警:结合 Prometheus + Grafana 搭建监控大盘,对 缓存命中率、页面错误、连接数、复制延迟 等关键指标设置阈值告警。
- 变更流程:任何参数或索引调整先在 测试环境 验证,选择业务低峰窗口滚动变更,并保留 回滚方案。
五 关键参数与命令示例
- 禁用透明大页(THP)与设置 readahead
- 临时:
echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag
- 持久:在
/etc/rc.local 加入上述命令(并确保可执行);WiredTiger 推荐 blockdev --setra 0 /dev/sdX(或 16)
- 内存与虚拟内存
sysctl -w vm.swappiness=10
sysctl -w vm.overcommit_memory=2
- 资源限制(/etc/security/limits.conf)
mongod soft nproc 65535
mongod hard nproc 65535
mongod soft nofile 100000
mongod hard nofile 100000
- MongoDB 配置片段(/etc/mongod.conf)
- 系统日志与网络
systemLog: destination: file; logAppend: true; path: /var/log/mongodb/mongod.log
net: bindIp: 127.0.0.1,<内网IP>; port: 27017; maxIncomingConnections: 65535
- 存储与 WAL
storage: dbPath: /data/db; journal: enabled: true; wiredTiger: engineConfig: cacheSizeGB: <按内存规划设置>
- 安全(可选)
security: authorization: enabled
- 监控与诊断
mongostat --all、mongotop
db.serverStatus().wiredTiger.cache(关注 maximum bytes configured、bytes currently in the cache、pages read into cache)
db.getProfilingLevel()、db.setProfilingLevel(1, { slowms: 100 })
以上命令与配置需结合服务器内存、磁盘与业务负载进行调优,并先在测试环境验证影响。