硬件是性能的基石,需优先满足以下要求:
调整Linux内核参数以适配MongoDB的高性能需求:
atime(文件访问时间)更新会增加磁盘I/O。通过修改/etc/fstab,在挂载选项中添加noatime(如/dev/sda1 /var/lib/mongodb ext4 noatime 0 2),然后重启系统或重新挂载分区。vm.swappiness控制系统使用交换空间的倾向,建议设置为10(范围0-100,值越小越倾向于使用内存)。执行sudo sysctl -w vm.swappiness=10并添加到/etc/sysctl.conf持久化。ulimit -n 65536临时调整,或在/etc/security/limits.conf中添加* soft nofile 65536; * hard nofile 65536永久生效。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled并添加到启动脚本(如/etc/rc.local)。通过/etc/mongod.conf调整核心参数,提升服务性能:
storage.wiredTiger.engineConfig.cacheSizeGB。net.maxIncomingConnections(默认10000)以适应高并发连接;设置net.port为常用端口(如27017),net.bindIp绑定服务器IP(如0.0.0.0允许所有IP访问,生产环境建议限制为特定IP)。operationProfiling.mode: slowOp)并设置慢查询阈值(operationProfiling.slowOpThresholdMs: 100,单位毫秒),便于定位性能瓶颈;确保storage.journal.enabled: true(默认开启),保障数据一致性(写入日志后才会持久化到磁盘)。索引是提升查询性能的关键,需合理设计和管理:
find、sort、aggregate等操作的高频字段创建索引(如db.collection.createIndex({ "user_id": 1 }))。对于多条件查询,使用复合索引(如db.collection.createIndex({ "status": 1, "create_time": -1 }),其中status选择性高,放在前面)。{ "name": 1, "age": 1 },查询db.collection.find({ "name": "John" }, { "age": 1 })可直接从索引获取数据,无需访问文档)。db.collection.getIndexes()查看索引列表,删除未使用的索引(通过db.collection.dropIndex("index_name"))。db.collection.reIndex()),优化索引碎片(数据增删会导致索引碎片化,影响查询性能)。优化查询语句,减少资源消耗:
db.collection.find({ "name": "John" }, { "name": 1, "age": 1, "_id": 0 })),减少网络传输和内存占用。limit()限制返回记录数(如db.collection.find().limit(100)),避免一次性返回大量数据导致内存溢出。explain()分析查询计划(如db.collection.find({ "name": "John" }).explain("executionStats")),确保查询使用了索引(winningPlan.inputStage.stage为IXSCAN表示使用索引,COLLSCAN表示全表扫描)。$match尽早过滤数据,$group减少数据量),避免不必要的阶段(如多余的$sort)。对于大规模数据和高可用需求,使用分片和复制集扩展性能:
replication.replSetName: "rs0"(需在所有节点配置相同)。user_id分片),提高写入和读取性能(每个分片处理部分数据)。选择合适的分片键(如高选择性字段,避免热点问题,如user_id比create_time更适合分片)。持续监控性能,及时发现和解决问题:
mongostat监控操作速率(如查询、插入、更新的数量和耗时),mongotop监控集合级别的读写时间(如mongotop 10每10秒刷新一次)。operationProfiling配置慢查询日志,定期分析慢查询(如db.profile.find().sort({ "ts": -1 }).limit(10)查看最近的10条慢查询)。