首先通过系统命令查看内存占用状态,明确是否为MongoDB导致的内存瓶颈:
free -m # 查看系统内存总量及使用情况
top -p $(pgrep mongod) # 查看MongoDB进程的内存占用详情
若MongoDB的RES
(常驻内存)或%MEM
(内存占比)过高,说明需要调整内存配置。
MongoDB默认使用WiredTiger存储引擎,其cacheSizeGB
参数控制内存缓存大小(默认约为系统内存的50%)。需根据服务器内存情况合理设置:
sudo nano /etc/mongod.conf
storage
部分,修改wiredTiger.engineConfig.cacheSizeGB
(建议设置为系统总内存的50%-70%,避免占用过多内存导致系统或其他进程卡顿):storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 示例:4GB内存用于MongoDB缓存(需根据实际调整)
sudo systemctl restart mongod
mongo
> db.serverStatus().wiredTiger.cache # 查看WiredTiger缓存状态
输出中的bytes dirty
(脏页数据量)、bytes valid
(有效缓存数据量)可反映缓存使用情况。若使用MMAPv1存储引擎(MongoDB 4.0+默认禁用),可通过调整cacheSizeGB
限制其内存占用:
/etc/mongod.conf
,修改storage.mmapv1.engineConfig.cacheSizeGB
(例如设置为2GB):storage:
engine: mmapv1
mmapv1:
engineConfig:
cacheSizeGB: 2
sudo systemctl restart mongod
注意:WiredTiger是MongoDB推荐的现代存储引擎,性能更优,建议优先使用。
若物理内存不足,可通过Swap空间缓解内存压力(但会增加磁盘IO,影响性能):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
/swapfile none swap sw 0 0
添加到/etc/fstab
文件中。vm.swappiness
参数(控制内核使用Swap的倾向,值越低越倾向于使用物理内存):sudo sysctl vm.swappiness=10 # 临时设置(0-100,建议10-30)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf # 永久设置
提示:Swap仅作为临时解决方案,根本解决仍需增加物理内存。
内存不足常因查询效率低导致大量数据加载到内存。通过以下方式减少内存消耗:
db.collection.createIndex({ field: 1 }) // 1表示升序索引
db.collection.find({ field: 1 }, { _id: 0, field: 1 })
)。limit()
减少返回文档数量(例如db.collection.find().limit(100)
)。operationProfiling:
mode: slowOp # 记录慢查询(默认100ms以上)
slowOpThresholdMs: 100
通过db.currentOp()
查看当前操作,db.system.profile.find()
查看慢查询记录。新版本MongoDB通常会优化内存管理算法,提升内存使用效率。建议升级到最新的稳定版本(如6.0+),以获得更好的性能和内存优化特性。
若数据量极大(TB级别),单台服务器内存无法满足需求,可通过分片将数据分布到多个服务器,横向扩展内存容量:
_id
或高频查询字段),确保数据均匀分布。
提示:分片需提前规划,避免后期迁移成本。
通过以上步骤,可有效解决Ubuntu下MongoDB内存不足的问题。需根据实际场景(如数据量、查询模式、服务器配置)选择合适的优化方案,并持续监控内存使用情况。