1. 配置WiredTiger缓存大小(核心优化项)
MongoDB在Debian系统上默认使用WiredTiger存储引擎,其cacheSizeGB参数直接决定了内存缓存的大小。建议将该参数设置为系统物理内存的60%-80%(需预留20%-40%给系统及其他应用)。例如,16GB内存的服务器可将cacheSizeGB设为9.6-12.8GB。配置方法:编辑/etc/mongod.conf文件,在storage.wiredTiger.engineConfig下添加或修改cacheSizeGB值(如cacheSizeGB: 10),重启MongoDB服务使配置生效。
2. 优化索引设计以减少内存占用
find、sort、aggregate等操作中频繁使用的字段建立索引(如db.collection.createIndex({ fieldName: 1 })),避免全表扫描导致的内存消耗。db.collection.createIndex({ field1: 1, field2: -1 })),提升多条件查询效率。db.collection.dropIndex("indexName"))。{ sparse: true })减少内存占用。3. 优化查询语句降低内存负载
db.collection.find({}, { field1: 1, field2: 1 })),避免将整个文档加载到内存。limit()方法控制查询结果数量(如db.collection.find().limit(100)),减少内存中的临时数据集大小。skip(10000).limit(10))会导致大量数据加载到内存,建议使用基于范围查询的分页(如find({ _id: { $gt: lastId } }}).limit(10))。4. 监控内存使用状态
db.serverStatus().mem查看内存使用详情(包括常驻内存resident、虚拟内存virtual、映射内存mapped);通过db.hostInfo()了解系统内存总量及MongoDB内存限制。mongostat(实时监控操作速率)、mongotop(查看集合级读写时间)定位内存瓶颈;或通过MongoDB Atlas等云监控工具进行更全面的性能分析。5. 数据管理与压缩优化
db.collection.deleteMany({ timestamp: { $lt: ISODate("2024-01-01") } }})),减少数据集大小。storage.wiredTiger.collectionConfig.blockCompressor参数启用Snappy(默认,平衡性能与压缩比)、Zlib(高压缩比)或LZ4(高性能)压缩算法,减少内存中的数据占用(如blockCompressor: snappy)。6. 调整系统与MongoDB配置
net.maxIncomingConnections参数(如maxIncomingConnections: 500)限制并发连接数,避免过多连接占用内存;或使用连接池(如Mongoose的poolSize)管理连接。db.adminCommand({ setParameter: 1, tcmallocAggressiveMemoryDecommit: 1 }),强制回收不再使用的内存,退还给操作系统(适用于内存紧张场景)。vm.swappiness值(如sudo sysctl -w vm.swappiness=0),减少系统向Swap分区写入数据的频率,避免因Swap导致的性能下降(需永久生效可修改/etc/sysctl.conf)。7. 分区与分片扩展
_id或高频查询字段),避免数据倾斜。