1. 配置WiredTiger缓存大小(核心内存控制手段)
Debian上MongoDB默认使用WiredTiger存储引擎,其内存占用主要由cacheSizeGB参数决定。该参数限制了WiredTiger用于缓存数据和索引的内存大小,需根据服务器内存容量和系统负载调整:
/etc/mongod.conf,在storage部分下的wiredTiger子部分添加或修改engineConfig.cacheSizeGB参数(支持固定值或百分比,如cacheSizeGB: 4表示分配4GB,cacheSizeGB: 50%表示使用系统50%可用内存)。修改后需重启MongoDB服务使配置生效:sudo systemctl restart mongod。2. 优化查询与索引(减少不必要的内存消耗)
不合理查询和过多索引会导致内存占用飙升,需通过以下方式优化:
find、sort、aggregate等常用操作字段创建索引(如db.collection.createIndex({ fieldName: 1 })),优先使用复合索引覆盖多字段查询(如db.collection.createIndex({ field1: 1, field2: -1 })),避免全表扫描。limit()方法减少查询结果集大小(如db.collection.find().limit(100)),并通过投影操作符(如db.collection.find({}, { field1: 1, field2: 1 }))仅返回所需字段,降低内存传输负担。explain()方法分析慢查询(如db.collection.find().explain("executionStats")),识别未使用索引的查询并针对性优化。3. 调整系统内核参数(改善内存管理效率)
通过调整Linux内核参数,可避免系统过度使用Swap或频繁回收内存:
vm.swappiness参数(值越低,系统越倾向于使用物理内存),推荐设置为0(禁用Swap,仅在内存耗尽时启用)或1(最小化Swap使用)。执行sudo sysctl -w vm.swappiness=0临时生效,或编辑/etc/sysctl.conf文件永久保存。4. 限制并发连接数(减少连接占用内存)
过多并发连接会消耗大量内存(每个连接需维护会话状态),需通过以下方式控制:
maxPoolSize(最大连接数,如200)和maxIdleTimeMS(连接最大空闲时间,如30000毫秒),避免闲置连接占用内存。/etc/security/limits.conf文件,增加MongoDB用户的最大文件描述符限制(如mongodb soft nofile 2000、mongodb hard nofile 2000),防止连接数超过系统阈值。修改后需重新登录或重启系统生效。5. 启用内存回收策略(主动释放未使用内存)
MongoDB默认使用TCMalloc内存分配器,可通过开启激进回收策略,快速释放不再使用的内存:
admin数据库执行db.adminCommand({ setParameter: 1, tcmallocAggressiveMemoryDecommit: 1 }),开启后立即回收未使用的内存并归还给操作系统。注意:该策略可能对性能产生短暂影响,建议在低峰期执行。6. 监控内存使用情况(持续优化依据)
定期监控内存使用状态,识别瓶颈并调整配置:
db.serverStatus().mem,查看resident(常驻内存,即实际使用的物理内存)、virtual(虚拟内存)、mapped(映射内存,即数据文件占用的内存)等指标,判断内存使用是否合理。mongostat(实时监控操作统计)、mongotop(查看集合级读写时间)等工具,分析内存使用趋势和热点操作。7. 其他优化措施(补充性方案)
blockCompressor: snappy,支持Snappy、Zlib、LZ4等算法),减少存储空间占用和I/O开销,间接降低内存压力。配置示例:storage.wiredTiger.collectionConfig.blockCompressor: snappy。