MongoDB Ubuntu版调优指南
MongoDB在Ubuntu上的性能调优需围绕硬件基础、系统配置、MongoDB参数、索引设计、查询优化及监控维护六大核心维度展开,以下是具体可操作的步骤:
storage.wiredTiger.engineConfig.cacheSizeGB设置),避免频繁磁盘交换。ufw disable)、SELinux(若启用)等服务,减少系统资源占用。vm.swappiness(设为10或更低):减少系统向磁盘交换内存的概率,避免I/O瓶颈。echo never > /sys/kernel/mm/transparent_hugepage/enabled并创建systemd服务确保开机生效。编辑/etc/mongod.conf(Ubuntu默认路径),调整以下关键参数:
storage.wiredTiger.engineConfig.cacheSizeGB取值为服务器内存的50%-75%(如8GB内存设为4-6GB),平衡数据缓存与系统可用内存。setParameter: { wiredTigerCollectionBlockCompressor: snappy },减少磁盘空间占用和网络传输量(可选zstd获得更高压缩比,但消耗更多CPU)。net.maxIncomingConnections设为1000(根据并发需求调整),避免连接数耗尽导致拒绝服务。storage.journal.commitIntervalMs(默认100ms),写密集型场景可适当增大(如200ms),批量提交提升写入吞吐量(需权衡数据安全性)。operationProfiling.mode: slowOp,并设置阈值operationProfiling.slowOpThresholdMs: 100(单位:毫秒),识别执行缓慢的查询。db.collection.createIndex({ field: 1 })(升序)或{ field: -1 }(降序),如db.users.createIndex({ username: 1, age: -1 })可优化多条件查询。db.collection.getIndexes()查看现有索引,删除未使用的索引(可通过explain()分析查询是否使用了某索引)。db.users.createIndex({ name: 1, age: 1 })对应find({ name: "John" }, { name: 1, age: 1 })),使查询无需访问底层集合,减少I/O。db.collection.reIndex(),尤其在高频率插入/删除后,可提升索引查询效率。explain("executionStats")查看查询执行细节(如winningPlan、executionTimeMillis),判断是否使用了索引、是否有全表扫描。find({ status: "active" })需为status创建索引),避免全集合扫描。skip()+limit()(如find().skip(20).limit(10)),但避免深层分页(如skip(10000)),可改用基于范围的分页(如find({ _id: { $gt: lastId } }).limit(10))。find({ query }, { field1: 1, field2: 1, _id: 0 }),仅返回必要字段,降低网络传输和内存消耗。match、group)组合为一个聚合管道(如db.users.aggregate([{ match: { age: { $gt: 18 } } }, { group: { _id: "$gender", count: { $sum: 1 } } }])),减少数据遍历次数,提升复杂查询效率。replication.replSetName参数。user_id、timestamp),将数据分布到多个分片上,提升写入和查询性能。mongostat(实时监控操作速率,如读写次数、延迟)和mongotop(查看集合级读写时间分布)快速定位性能瓶颈。mongodump(逻辑备份)和mongorestore(恢复)定期备份数据(如每日增量备份+每周全量备份),确保数据安全。/etc/security/limits.d/mongodb.conf中增加mongod进程的nofile限制(如soft nofile 64000、hard nofile 64000),避免高并发下连接数受限。/etc/fstab,为MongoDB数据目录添加noatime选项(如/dev/sdb1 /var/lib/mongodb ext4 noatime 0 2),减少文件访问时间更新的开销。以上调优措施需根据实际业务场景(如读写比例、数据量、并发量)灵活调整,建议在测试环境验证后再应用于生产环境。