Ubuntu环境下MongoDB性能调优的关键维度
free -m命令监控内存使用情况。iostat或vmstat命令监控磁盘IO性能。/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB参数,设置为物理内存的50%-75%(避免占用过多内存导致系统不稳定)。例如,8GB内存服务器可设置为4-6GB。net.maxIncomingConnections(默认10000)和net.maxOutgoingConnections参数,根据应用连接需求增加连接数上限,避免连接拒绝。operationProfiling.mode: "slowOp"并配置slowOpThresholdMs(默认100ms),监控慢查询(执行时间超过阈值的操作),帮助定位性能瓶颈。user_id、order_id)、排序字段(如created_at)和聚合字段创建单字段或复合索引。例如,db.orders.createIndex({user_id: 1, order_id: 1})可加速按用户ID和订单ID的联合查询。db.collection.find({field: value}, {field1: 1, field2: 1})),避免回表操作(读取文档本身),减少IO开销。db.collection.getIndexes()查看索引列表,删除未使用或冗余的索引。explain("executionStats")方法查看查询执行计划,确认索引是否被正确使用(如winningPlan中是否包含索引),优化未使用索引。{field: 1, _id: 0})只返回需要的字段,减少数据传输量。例如,db.users.find({age: {$gt: 18}}, {name: 1, age: 1, _id: 0})仅返回name和age字段。skip()和limit()进行深度分页(如第1000页),改用_id字段分页(db.collection.find({_id: {$gt: lastObjectId}}).limit(10)),减少查询扫描的数据量。/^abc/可使用索引,而/abc/无法使用),优先使用精确匹配或范围查询。insertMany()、updateMany()等批量操作替代循环单条操作,减少网络往返次数,提高写入效率。sharding.clusterRole: "shardsvr"),将数据分布在多个分片服务器上,提高查询和写入的横向扩展能力。需合理选择分片键(如user_id),避免数据倾斜。replication.replSetName: "rs0"),提高数据可用性(自动故障转移)和读取扩展性(将读取请求分发到从节点)。需确保副本集成员数量≥3(奇数),避免脑裂问题。mongostat(实时监控操作速率、内存使用、磁盘IO)和mongotop(查看集合级别的读写时间)工具,实时了解数据库性能状态。systemLog.slowQueryLog: true,systemLog.slowQueryLogThresholdMs: 100),定期分析慢查询日志,优化高频慢查询。db.collection.reIndex()命令重建碎片化索引,减少索引查询时间;使用mongodump和mongorestore定期备份数据,防止数据丢失。/etc/sysctl.conf文件,优化内核参数:
vm.swappiness=10(降低交换分区使用,避免内存不足时频繁换页);net.core.somaxconn=65535(增加TCP连接队列长度,避免连接拒绝);fs.file-max=65535(增加系统最大文件描述符数,支持更多连接)。echo never > /sys/kernel/mm/transparent_hugepage/enabled命令禁用THP,并添加到启动脚本(如/etc/rc.local)中永久生效。