MongoDB在Ubuntu上的性能调优技巧
free -m查看内存使用情况,根据业务需求调整)。ufw disable)、禁用SELinux(如setenforce 0)等,减少系统负载,释放资源供MongoDB使用。/etc/fstab中为MongoDB数据目录添加noatime参数(如/var/lib/mongodb ext4 defaults,noatime 0 2),禁止系统更新文件的访问时间,减少不必要的磁盘写入。/etc/security/limits.conf,添加* soft nofile 64000和* hard nofile 64000;编辑/etc/systemd/system.conf,设置DefaultLimitNOFILE=64000,然后重启系统生效。/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB参数,设置为系统内存的70%-80%(如cacheSizeGB: 4),控制MongoDB使用的内存上限,避免占用过多系统资源。net.maxIncomingConnections(默认10000,可根据并发需求增加)和net.maxOutgoingConnections(默认100,可根据应用需求调整),适应高并发连接场景。operationProfiling部分设置mode: "slowOp"和slowOpThresholdMs: 100(阈值可根据业务调整,如100ms),记录慢查询日志,帮助识别性能瓶颈(如未使用索引的查询)。db.users.createIndex({ username: 1 })),避免全表扫描。{ username: 1, email: 1 }),创建复合索引可提升查询效率,注意将选择性高的字段(如唯一值多的字段)放在前面。db.users.find({ age: { gt: 18 } }, { name: 1, age: 1, _id: 0 })),避免回表读取文档,减少磁盘I/O。db.collection.reIndex()重建碎片化索引,提升索引查询效率;使用db.collection.stats()分析索引使用情况,删除不再使用的索引(如db.collection.dropIndex("index_name")),减少写操作开销。db.users.find({ username: "john" })),避免大范围查询(如{ age: { gt: 0 } }),减少全表扫描。db.users.find({}, { name: 1, email: 1, _id: 0 })),减少数据传输量和内存消耗。skip()和limit()进行分页(如db.users.find().skip(20).limit(10)),避免一次性获取大量数据导致内存溢出。match、group、sort)组合在聚合管道中(如db.users.aggregate([{ $match: { age: { gt: 18 } } }, { $group: { _id: "$gender", count: { $sum: 1 } } }])),减少查询次数,提升效率。cacheSizeGB)是关键参数,建议设置为系统内存的70%-80%(如4GB内存设置cacheSizeGB: 3),确保有足够内存缓存常用数据和索引。zstd(如storage.wiredTiger.engineConfig.compressor: "zstd"),但会增加CPU开销,需根据业务需求权衡。mongostat监控数据库操作的速率(如读写次数、延迟),mongotop监控集合级别的读写时间(如哪些集合耗时高),快速定位性能瓶颈。explain()方法(如db.users.find({ username: "john" }).explain("executionStats"))查看查询执行计划,确认是否使用了索引、扫描的文档数量等,针对性优化查询。username字段分片),提升读写性能和扩展性。mongodump和mongorestore定期备份数据(如每日备份),防止数据丢失(如服务器故障、误操作)。