1. 配置WiredTiger缓存大小(核心优化项)
MongoDB在Debian上默认使用WiredTiger存储引擎,其cacheSizeGB
参数直接决定内存占用上限。建议将该值设置为系统可用物理内存的60%-80%(如16GB内存可设为9.6-12.8GB),避免占用过多内存导致系统或其他进程卡顿。配置方法有两种:一是修改/etc/mongod.conf
文件,在storage.wiredTiger.engineConfig
下添加cacheSizeGB: X
(X为具体数值);二是启动时通过命令行参数--wiredTigerCacheSizeGB X
指定。配置后需重启MongoDB服务生效。
2. 优化查询与索引设计
不合理查询会消耗大量内存,需通过以下方式优化:
find
、sort
、aggregate
等操作的高频字段创建索引(如db.collection.createIndex({ fieldName: 1 })
),复合索引需根据查询条件设计(如db.collection.createIndex({ field1: 1, field2: -1 })
)。db.collection.find({}, { field1: 1, field2: 1 })
),避免全表数据加载到内存。limit()
方法控制返回记录数(如db.collection.find().limit(100)
),减少内存占用。explain()
方法查看查询执行计划,识别全表扫描或未使用索引的查询并优化。3. 调整系统内核参数
Debian系统的内核参数会影响MongoDB内存使用效率,需重点调整:
vm.swappiness
参数(值为0-100,0表示尽量不用Swap),建议设为10
(sudo sysctl -w vm.swappiness=10
),避免内存不足时频繁交换到磁盘。vm.dirty_ratio
(脏页占内存比例,超过则触发刷新)和vm.dirty_background_ratio
(后台刷新阈值),建议设为20
和10
(sudo sysctl -w vm.dirty_ratio=20; sudo sysctl -w vm.dirty_background_ratio=10
),平衡写入性能与内存占用。4. 管理连接数与内存回收
过多连接会消耗内存,需合理控制:
maxPoolSize
参数(如Node.js驱动设为100
),避免过多并发连接占用内存。db.adminCommand({setParameter: 1, tcmallocAggressiveMemoryDecommit: 1})
命令开启tcmalloc的激进内存回收策略,快速释放未使用内存(注意:可能对性能有轻微影响,需根据实际情况测试)。5. 定期维护与监控
持续优化需依赖监控与维护:
db.serverStatus().mem
命令查看内存使用详情(包括常驻内存、虚拟内存、映射内存),或使用mongostat
(实时监控操作)、mongotop
(查看集合级读写时间)工具分析性能瓶颈。db.collection.deleteMany({ expireAt: { $lt: new Date() } })
删除TTL索引对应的过期文档),或使用compact
命令回收碎片空间(需停机执行)。