1. 调整WiredTiger缓存大小(核心配置)
Linux环境下,MongoDB(3.2及以上版本默认使用WiredTiger存储引擎)的内存管理关键在于合理配置WiredTiger缓存。通过storage.wiredTiger.engineConfig.cacheSizeGB参数设置缓存上限,建议值为系统可用内存的50%-70%(如系统有16GB可用内存,可设置为8GB)。需避免分配超过系统内存的70%,需为操作系统、其他应用程序预留足够资源,防止内存耗尽导致系统崩溃。
2. 优化操作系统内核参数
vm.swappiness:该参数控制系统使用Swap空间的倾向(范围0-100),建议设置为10或更低(如echo 10 | sudo tee /proc/sys/vm/swappiness),减少内存数据向磁盘Swap的迁移,提升内存访问效率。需持久化设置,可将vm.swappiness=10添加至/etc/sysctl.conf。vm.overcommit_memory:控制内存超额分配,设置为1(允许超额分配)可避免MongoDB因内存申请失败而报错,但需注意监控内存使用,防止过度分配。同样需持久化至/etc/sysctl.conf。vm.max_map_count:内存映射文件的数量限制(默认约6.5万),MongoDB需要较多内存映射区域,建议设置为262144(echo 262144 | sudo tee /proc/sys/vm/max_map_count),并添加至/etc/sysctl.conf持久化。3. 索引设计与优化
username、order_id)创建索引,可大幅减少全表扫描,降低内存占用。例如,使用db.users.createIndex({username: 1})为username字段创建升序索引。db.collection.indexes()查看索引列表)。email字段仅部分用户有),使用稀疏索引(db.users.createIndex({email: 1}, {sparse: true}))可节省内存空间。4. 查询性能优化
db.users.find({username: "admin"}, {username: 1, _id: 0})),避免回表操作,减少内存消耗。limit()方法限制查询返回的文档数量(如db.users.find().limit(10)),并通过投影操作符(如{name: 1, age: 1, _id: 0})明确指定返回字段,减少内存传输量。explain()方法(如db.users.find({age: {$gt: 18}}).explain("executionStats"))查看查询执行计划,识别全表扫描或索引未命中的查询,针对性优化。5. 监控与持续调优
db.serverStatus().mem查看MongoDB内存使用详情(包括WiredTiger缓存占用、常驻内存、虚拟内存等);mongostat监控内存使用趋势(如每秒缓存命中率);mongotop查看集合级内存消耗(如哪个集合占用内存最多)。6. 其他优化措施
storage.wiredTiger.collectionConfig.blockCompressor参数设置压缩算法(如snappy、zlib),减少数据占用的内存和磁盘空间(snappy压缩率高且性能较好,zlib压缩率更高但消耗更多CPU)。compact命令回收未使用的存储空间(如db.runCommand({compact: "users"}));使用repairDatabase命令修复数据库碎片(需停机操作)。user_id字段分片)。