硬件是性能的基础,需优先满足以下要求:
storage.wiredTiger.engineConfig.cacheSizeGB配置)。例如,16GB内存服务器可设置缓存为8-11GB。vm.swappiness:降低系统使用交换空间的倾向(设为10或更低),避免内存不足时频繁换页导致性能下降。执行echo 10 | sudo tee /proc/sys/vm/swappiness,并添加到/etc/sysctl.conf持久化。transparent_hugepage:MongoDB对透明大页的支持不佳,禁用后可减少内存管理开销。执行echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled,并添加到启动脚本(如/etc/rc.local)。noatime选项(减少文件访问时间更新)。-i size=512),避免inode耗尽导致无法创建文件。/etc/sysctl.conf中添加net.core.rmem_max=16777216(接收缓冲区)和net.core.wmem_max=16777216(发送缓冲区),提升网络吞吐量。在/etc/mongod.conf中调整storage.wiredTiger.engineConfig.cacheSizeGB,根据服务器内存分配合理值(如8GB内存设为5-6GB)。修改后需重启服务生效。
storage.journal.enabled=true(默认开启),保障数据一致性(尤其在崩溃恢复时)。systemLog.logRotate为reopen(默认),并通过logappend=true保留日志,避免频繁切换日志文件。根据客户端数量调整net.maxIncomingConnections(默认10000),避免连接数过多导致资源耗尽。例如,100个并发客户端可设置为2000。
find、sort、aggregate常用字段创建索引(如db.collection.createIndex({user_id: 1}))。{status: 1, create_time: -1}),将选择性高的字段(如status)放在前面,提升查询效率。db.collection.find({user_id: 1}, {name: 1, age: 1}).explain()显示“IXSCAN”阶段未访问文档),减少磁盘IO。每个索引会增加写操作(插入、更新、删除)的开销(约10%-20%性能损耗),定期通过db.collection.getIndexes()审查索引,删除未使用的索引(如db.collection.dropIndex("index_name"))。
db.collection.reIndex()(如每月一次),整理碎片化索引,提升查询速度。db.collection.dropIndex("index_name")暂时禁用索引,插入完成后再重建,减少索引维护开销。查询时仅返回所需字段(如db.collection.find({}, {name: 1, age: 1, _id: 0})),减少数据传输量和内存占用。
使用limit()方法限制返回的文档数量(如db.collection.find().limit(100)),避免一次性返回大量数据导致内存溢出。
通过explain()方法分析查询计划(如db.collection.find({user_id: 1}).explain("executionStats")),确保查询使用了索引(winningPlan.stage为“IXSCAN”而非“COLLSCAN”)。
$match、$group阶段,减少数据处理次数。$match阶段使用索引字段(如db.collection.aggregate([{ $match: {status: "active"} }, { $group: { _id: "$department", count: { $sum: 1 } } }])),提升聚合效率。对于TB级数据或高并发写入场景,使用分片将数据分散到多个节点(如按user_id分片),提升读写性能。需注意:
user_id而非create_time)。sh.shardCollection("db.collection", {user_id: "hashed"}))。通过复制集(如3个节点)提高数据可用性,读操作可分发到从节点,减轻主节点压力。需配置replication.replSetName(如rs.initiate()初始化复制集)。
mongostat --host localhost --port 27017)。mongotop --host localhost --port 27017)。开启慢查询日志(operationProfiling.slowOpThresholdMs=100,单位毫秒),通过db.system.profile.find()分析慢查询,针对性优化。
使用Prometheus+Grafana搭建可视化监控平台,实时监控MongoDB的内存、CPU、磁盘I/O等指标,及时发现性能瓶颈。