MongoDB在Debian上的内存管理指南
WiredTiger是MongoDB的默认存储引擎(MMAPv1已弃用),其缓存大小是内存管理的核心参数。通过限制缓存大小,可避免MongoDB占用过多系统内存,影响其他进程运行。
/etc/mongod.conf,定位到storage.wiredTiger.engineConfig部分,设置cacheSizeGB参数(单位:GB)。建议值为系统可用内存的50%-75%(如16GB内存的服务器,可设置为8-12GB)。storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据实际内存调整
--wiredTigerCacheSizeGB直接指定缓存大小(适用于临时测试)。mongod --wiredTigerCacheSizeGB 4
定期监控内存状态是优化的前提,可通过以下命令获取关键指标:
db.serverStatus().mem:查看MongoDB内存使用详情,包括常驻内存(resident)(实际占用的物理内存)、虚拟内存(virtual)(进程占用的虚拟地址空间)、映射内存(mapped)(映射到内存的文件大小)。top(查看进程内存占用)、vmstat(查看系统内存、交换分区使用情况)、free -h(查看内存总量及剩余量)等命令,综合评估系统内存压力。不合理查询会消耗大量内存(如全表扫描、未限制返回数据量),优化查询是降低内存占用的关键:
find、sort、aggregate等操作的高频字段创建索引(如db.collection.createIndex({ fieldName: 1 })),避免全表扫描。使用explain()方法分析查询执行计划,确认是否使用了索引。limit()方法减少查询返回的文档数量(如db.collection.find().limit(100)),使用投影操作符(如db.collection.find({}, { field1: 1, field2: 1 }))仅返回必要字段,降低内存消耗。调整Linux内核参数,优化内存分配策略,减少Swap使用:
vm.swappiness:该参数控制系统使用Swap分区的倾向(值越低,越倾向于使用物理内存)。建议设置为0(禁用Swap,仅在内存不足时触发)或1(最小化Swap使用)。/etc/sysctl.conf,添加vm.swappiness=0,然后执行sudo sysctl -p使配置生效。vm.dirty_ratio(脏页占内存的比例,超过则触发写入磁盘)、vm.dirty_background_ratio(后台写入脏页的比例),建议设置为20和10(需根据磁盘性能调整),避免频繁磁盘I/O占用内存。通过systemd限制MongoDB的内存使用,防止其占用过多资源导致系统崩溃:
/lib/systemd/system/mongod.service),在[Service]部分添加MemoryMax(最大内存限制)和MemoryHigh(内存使用警告阈值)参数。[Service]
MemoryMax=8G # 最大允许使用8GB内存
MemoryHigh=6G # 内存使用超过6GB时触发警告
sudo systemctl daemon-reload重新加载配置,sudo systemctl restart mongod重启服务使限制生效。db.adminCommand({setParameter: 1, tcmallocAggressiveMemoryDecommit: 1})开启tcmalloc的激进内存回收策略,快速释放不再使用的内存(可能对性能有轻微影响,适用于内存紧张场景)。db.collection.dropIndex("indexName"))、归档过期数据(如将旧数据迁移至冷存储)、压缩集合(db.collection.runCommand({ compact: 'collectionName' })),减少内存占用。