CentOS环境下MongoDB性能调优指南
/etc/fstab添加noatime参数挂载数据目录,减少文件访问时间更新带来的磁盘写入);vm.dirty_background_ratio(建议10-20)、vm.dirty_ratio(建议20-30),控制脏页刷新频率,避免内存过度占用;echo never > /sys/kernel/mm/transparent_hugepage/enabled),减少内存管理开销。/etc/mongod.conf中设置storage.wiredTiger.engineConfig.cacheSizeGB,建议值为物理内存的50%-70%(如8GB内存设为4-5GB),避免占用过多内存导致系统OOM。storage.wiredTiger.engineConfig.directoryForIndexes: true,将索引文件与集合数据文件分别存放在dbPath下的index和collection子目录,分散磁盘I/O压力(适合索引查询密集的业务,如电商搜索)。storage.wiredTiger.collectionConfig.blockCompressor,根据场景选择: snappy(压缩率2:1,CPU开销低);zstd(压缩率4:1,解压速度快);zlib(压缩率3:1,CPU开销中等);none(避免无效CPU消耗)。net.maxIncomingConnections(建议5000以上),应对高并发客户端连接;net.compression.compressors: "snappy,zstd"(默认已启用),减少副本集同步、客户端通信的网络传输量(跨机房部署时效果显著);socketOptions.tcpNoDelay: true(禁用Nagle算法,降低延迟)、socketOptions.keepAlive: true(保持连接活跃,避免频繁重建)。systemLog.logRotate: "reopen"(配合系统日志轮转工具,如logrotate),避免日志文件过大占用磁盘空间;operationProfiling.mode: "slowOp",并设置operationProfiling.slowOpThresholdMs: 100(阈值可根据业务调整,如100ms),定位慢查询(通过db.currentOp()或mongotop工具分析);storage.journal.commitIntervalMs: 100(默认100ms,降低可提高数据持久性,但增加I/O压力),平衡数据安全与性能。user_id、order_id)、排序字段(如created_at)、范围查询字段(如price)创建索引(如db.collection.createIndex({user_id: 1}));避免为低频字段创建索引(减少写操作开销)。{status: "active", created_at: -1}),创建复合索引(如db.collection.createIndex({status: 1, created_at: -1})),提高查询效率(遵循最左前缀原则)。db.collection.find({user_id: 1}, {name: 1, _id: 0})),避免访问实际文档(减少磁盘I/O)。explain("executionStats")查看执行计划,确认winningPlan使用了索引)。db.collection.dropIndex("index_name")),减少索引维护开销;定期重建碎片化严重的索引(如db.collection.reIndex())。readPreference: "secondary",将读取请求分发到从节点。user_id哈希分片,分散数据压力)。user_id、order_id),避免数据倾斜(如避免使用status字段,因大部分数据状态相同,导致分片负载不均)。mongostat(查看QPS、延迟)、mongotop(查看集合级读写时间)、db.serverStatus()(查看内存、连接数、锁等待等指标)工具,定期检查性能指标;结合第三方监控工具(如Prometheus+Grafana、Percona Monitoring and Management(PMM)),实现可视化监控和告警。db.setProfilingLevel(1, 100)开启慢查询日志,使用db.system.profile.find().sort({ts: -1}).limit(10)查看最近的慢查询,针对性优化(如添加索引、调整查询语句)。db.collection.remove({expireAt: {$lt: new Date()}})删除过期文档;定期备份数据(如使用mongodump+mongorestore,或云数据库的自动备份功能),防止数据丢失。