一、硬件资源优化
storage.wiredTiger.engineConfig.cacheSizeGB参数设置。二、操作系统层面调优
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled关闭,并添加到/etc/rc.local持久化。sysctl -w vm.swappiness=10设置,并添加到/etc/sysctl.conf持久化。ulimit -n 20000临时设置,或修改/etc/security/limits.conf永久生效。blockdev --setra 32 /dev/sdb(sdb为MongoDB存储设备)设置预读值为16-32扇区,并添加到/etc/rc.local持久化。/etc/sysctl.conf中的网络参数,如增加net.core.somaxconn(并发连接队列长度,设为32768)、net.ipv4.tcp_max_syn_backlog(SYN队列长度,设为16384)、net.core.rmem_max/net.core.wmem_max(读写缓冲区大小,设为16777216),并通过sysctl -p生效。三、MongoDB配置优化
/etc/mongod.conf中设置storage.wiredTiger.engineConfig.cacheSizeGB,建议为服务器物理内存的50%-70%(需预留系统和其他应用的内存)。例如:storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4
修改后重启MongoDB生效。operationProfiling.mode: slowOp,阈值设为100ms),便于定位性能瓶颈;定期归档或清理日志文件,避免占用过多磁盘空间。/etc/mongod.conf中设置net.maxIncomingConnections(最大入站连接数,默认10000,可根据并发需求调整),避免连接数过多导致资源耗尽。四、索引优化
db.collection.createIndex({ field: 1 })),复合索引需根据查询条件字段顺序排列(最常用于筛选的字段在前)。例如,查询username和email时,创建复合索引db.users.createIndex({ username: 1, email: 1 })。db.collection.find({ field: 1 }, { field: 1, _id: 0 })),提升查询效率。db.collection.reIndex()重建索引,优化索引碎片;通过db.collection.getIndexes()查看现有索引,删除不再使用的冗余索引,减少内存和存储开销。explain("executionStats")查看查询执行计划,确认是否使用了索引(winningPlan中的stage为IXSCAN表示使用了索引),根据结果调整索引策略。五、查询优化
{ field: 1, _id: 0 })只返回需要的字段,减少数据传输量;使用分页(skip()+limit())处理大数据集,避免一次性返回过多数据。$or查询(可能导致索引失效),改用$in或其他方式;批量操作(如bulkWrite())代替单条插入/更新,减少与数据库的通信次数。六、分片与副本集
replication.replSetName(如rs.initiate()初始化)。user_id),避免数据倾斜(如避免使用单调递增的字段作为分片键)。七、监控与诊断
mongostat监控数据库操作的吞吐量(如读写次数、延迟),mongotop监控集合级别的读写时间(定位慢查询集合)。