MongoDB作为常用的NoSQL数据库,默认会尽可能占用系统内存来提升数据读写性能,当服务器内存资源有限或者业务数据量增长过快时,就容易出现内存不足的问题,影响业务的正常运行。

一、检查MongoDB内存使用情况
在解决内存不足问题前,首先需要明确当前MongoDB的内存占用情况,判断是缓存占用过高还是其他模块存在内存泄漏。
1. 通过命令行查看内存状态
连接MongoDB服务后,执行以下命令可以获取内存相关的统计信息:
# 连接MongoDB
mongo
# 切换到admin库
use admin
# 执行服务器状态查询
db.runCommand({serverStatus: 1}).mem
返回结果中的resident表示MongoDB进程占用的物理内存,virtual表示占用的虚拟内存,mapped表示映射的内存大小,通过这些数值可以初步判断内存占用是否合理。
2. 查看WiredTiger存储引擎缓存配置
MongoDB默认使用WiredTiger存储引擎,其缓存大小直接影响内存占用,可以通过以下命令查看当前缓存配置:
db.serverStatus().wiredTiger.cache
重点关注maximum bytes configured字段,这是当前设置的WiredTiger缓存最大值,bytes currently in the cache是当前缓存实际使用量。
二、调整WiredTiger缓存大小
如果服务器上除了MongoDB还有其他服务需要运行,或者MongoDB占用的内存超过了预期,可以通过调整WiredTiger的缓存大小来释放部分内存。
1. 临时调整缓存大小(重启后失效)
可以在MongoDB运行时动态调整缓存大小,执行以下命令:
# 设置缓存大小为2GB,注意单位是字节,2GB=2*1024*1024*1024
db.adminCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: "cache_size=2147483648"})
2. 永久调整缓存大小
如果需要重启后配置依然生效,需要修改MongoDB的配置文件,通常配置文件路径为/etc/mongod.conf,在storage模块下添加WiredTiger缓存配置:
storage:
wiredTiger:
engineConfig:
# 缓存大小设置为2GB,可根据服务器内存情况调整
cacheSizeGB: 2
修改完成后重启MongoDB服务即可生效:
# 重启MongoDB服务 systemctl restart mongod
三、优化数据和查询减少内存占用
除了调整缓存配置,还可以通过优化数据和查询逻辑来降低MongoDB的内存消耗。
1. 清理无用数据和过期索引
定期清理业务不再需要的冗余数据,删除无效的索引,减少内存中需要维护的元数据量:
# 删除指定集合中30天前的过期数据
db.test_collection.deleteMany({create_time: {$lt: new Date(Date.now() - 30*24*60*60*1000)}})
# 删除无用索引
db.test_collection.dropIndex("idx_unused")
2. 优化查询语句和索引
没有命中索引的查询会触发全表扫描,不仅会增加CPU消耗,还会将大量数据加载到内存中,因此需要为常用查询字段建立合适的索引:
# 为user_id字段创建普通索引
db.test_collection.createIndex({user_id: 1})
# 为组合查询字段创建组合索引
db.test_collection.createIndex({user_id: 1, create_time: -1})
同时避免使用$where、mapReduce等会大量占用内存的查询操作,尽量使用索引覆盖查询。
四、调整系统内核参数
Linux系统本身的内存管理参数也会影响MongoDB的内存使用,适当调整后可以提升内存利用率:
- 调整
vm.swappiness参数,降低系统使用交换分区的倾向,避免MongoDB数据被频繁换出到磁盘,建议设置为10以内:# 临时调整swappiness sysctl vm.swappiness=10 # 永久调整,写入配置文件 echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p
- 调整
vm.dirty_ratio和vm.dirty_background_ratio,控制脏页的回写时机,避免大量脏页集中回写导致内存波动。
五、分片和扩容方案
如果经过上述优化后内存依然不足,说明单节点的内存已经无法满足业务需求,可以考虑以下两种方案:
- 如果数据量还在持续增长,可以部署MongoDB分片集群,将数据分散到多个节点上,每个节点只存储部分数据,降低单节点的内存压力。
- 如果是单节点内存硬件不足,可以直接升级服务器的内存配置,从硬件层面提升内存资源上限。
注意:所有内存调整操作都需要根据服务器的实际内存总量来设置,不要将WiredTiger缓存设置得超过服务器总内存的50%,避免影响系统其他服务的正常运行。
MongoDB内存优化wiredTiger_cache_sizeGB修改时间:2026-06-24 08:03:32