一、内存管理与WiredTiger缓存优化
MongoDB在Linux下的性能核心之一是内存利用率,尤其是WiredTiger存储引擎的缓存配置。需重点调整以下参数:
storage.wiredTiger.engineConfig.cacheSizeGB参数限制缓存大小,建议值为服务器物理内存的50%-70%(需预留内存给系统及其他应用)。例如,若服务器有16GB内存,可设置为8GB(cacheSizeGB: 8),避免内存过度占用导致系统交换(Swap)。vm.swappiness(默认60)至10或更低(echo 10 | sudo tee /proc/sys/vm/swappiness),减少系统使用交换空间的倾向,提升内存访问效率;vm.overcommit_memory=1(echo 1 | sudo tee /proc/sys/vm/overcommit_memory),允许内核超额分配内存,避免MongoDB因内存申请失败而崩溃。二、索引优化(提升查询效率的关键)
索引是MongoDB查询性能的“加速器”,需遵循以下原则:
username、email、timestamp)创建索引,复合索引需根据查询条件顺序排列字段(如db.users.createIndex({ username: 1, email: 1 }),优先筛选username再匹配email);db.users.createIndex({ username: 1, name: 1 }),查询{ username: "admin", name: 1 }可直接从索引获取数据,无需访问文档);db.collection.reIndex()重建碎片化索引,使用db.collection.dropIndex()删除不再使用的冗余索引(可通过db.collection.getIndexes()查看现有索引)。三、Linux内核参数调优(减少I/O与网络瓶颈)
/etc/security/limits.conf文件,添加* soft nofile 65535、* hard nofile 65535(用户级限制),并执行ulimit -n 65535立即生效;blockdev --setra 32 /dev/sdb(/dev/sdb为MongoDB数据盘)设置预读为16KB(32扇区×512字节/扇区),减少内存中无用数据占用;/etc/sysctl.conf,增加net.core.somaxconn=32768(最大连接队列长度)、net.ipv4.tcp_max_syn_backlog=16384(SYN队列长度)、net.ipv4.tcp_rmem='1024 4096 16777216'(TCP读缓冲区)、net.ipv4.tcp_wmem='1024 4096 16777216'(TCP写缓冲区),提升网络吞吐能力。四、存储与硬件优化(基础性能保障)
storage.dbPath)挂载至SSD分区,显著降低I/O延迟;五、查询与配置优化(减少资源消耗)
explain()方法(如db.collection.find(query).explain("executionStats"))分析查询执行计划,确保查询使用了索引;避免使用$or、$in等可能导致全表扫描的操作符;projection(如db.collection.find({}, { name: 1, age: 1 }))只返回必要字段,使用limit()(如db.collection.find().limit(100))限制返回结果数量,减少网络传输和内存占用;w参数(如w: 1表示写入主节点即可确认,w: "majority"表示写入多数节点),平衡性能与数据可靠性。六、分片与副本集(横向扩展提升并发)
replication.replSetName)实现数据冗余和高可用,读操作可分发至从节点,减轻主节点压力;sharding.clusterRole)将数据分散至多个分片(Shard),提升查询和写入并发能力。选择合适的分片键(如user_id、timestamp),避免数据倾斜(如避免使用单调递增的_id作为分片键)。七、监控与持续调优(动态调整策略)
mongostat(监控QPS、延迟)、mongotop(监控集合级读写时间)实时查看性能指标;mongod.conf中设置operationProfiling.mode="slowOp"、operationProfiling.slowOpThresholdMs=100(慢查询阈值为100ms),记录慢查询语句并针对性优化;