一、硬件资源优化:解决基础性能瓶颈
storage.wiredTiger.engineConfig.cacheSizeGB(如128GB内存可设为64GB),确保高频访问的数据能驻留内存,减少磁盘I/O。需预留部分内存给操作系统(如系统进程、文件缓存)。net.maxIncomingConnections设置合理的连接数上限)。二、存储引擎与文件系统优化:提升I/O效率
noatime,nodiratime禁用访问时间记录,减少元数据写入;barrier=0关闭写屏障,提升写入性能,但需确保有电池备份的RAID控制器)。storage.wiredTiger.engineConfig.directoryForIndexes: true配置,将索引文件存放在dbPath/index目录,数据文件存放在dbPath/collection目录。若服务器有多个物理磁盘,可将索引目录挂载到SSD,数据目录挂载到HDD,分散I/O压力,提升索引查询性能。三、MongoDB配置优化:针对性调整参数
cacheSizeGB。可通过db.serverStatus().mem命令查看内存使用情况(如wiredTiger.cache.bytes_dirty表示脏数据量,若接近cacheSizeGB则需扩容),避免缓存溢出导致频繁写入磁盘。vm.dirty_ratio(默认20%,表示内存中脏页占比达到20%时触发写入)和vm.dirty_background_ratio(默认10%,表示后台写入的脏页阈值)。建议设置为dirty_ratio=10、dirty_background_ratio=5,减少脏页集中写入导致的I/O峰值。vm.swappiness=5(默认60%),减少系统使用Swap分区的概率。Swap会导致内存数据写入磁盘,大幅提升查询延迟,生产环境建议关闭Swap或设置为极低值。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled命令禁用THP,并添加到/etc/rc.local实现开机自启。四、索引与查询优化:减少资源消耗
user_id、order_date)创建索引,使用db.collection.createIndex({field: 1})命令。避免过度索引(每个索引会增加写入开销),可通过db.collection.stats().indexSizes查看索引大小。explain("executionStats")分析查询计划,确保查询能利用索引(winningPlan.inputStage.stage为IXSCAN表示使用索引)。避免全表扫描(COLLSCAN),尽量使用投影({field: 1, _id: 0})限制返回字段,使用limit()限制返回结果数量。{user_id: 1, name: 1},查询db.users.find({user_id: 1}, {name: 1, _id: 0})可实现覆盖查询,提升查询性能。五、分片与副本集:横向扩展提升吞吐量
readPreference=secondary),减轻主节点的读压力。副本集还能提升写入性能(如写关注writeConcern=majority可保证数据一致性,但会增加延迟,需根据场景调整)。user_id、order_date),避免数据倾斜(如热点分片)。分片能显著提升写入和查询吞吐量,适合大规模分布式场景。六、监控与诊断:持续优化性能
mongostat(查看每秒操作数、延迟、锁等待等指标)、mongotop(查看集合级别的读写时间分布)监控数据库性能,及时发现异常。systemLog.slowQueryThresholdMs=100,表示超过100ms的查询为慢查询),通过db.currentOp()或mongotop定位慢查询,针对性优化。