MongoDB在Linux上的内存使用策略
WiredTiger是MongoDB的默认存储引擎(MongoDB 3.2+),其缓存大小是影响内存使用的关键参数。通过storage.wiredTiger.engineConfig.cacheSizeGB配置项可设置缓存上限,建议值为服务器物理内存的50%-70%(需预留足够内存给系统进程、其他应用及MongoDB自身开销)。例如,若服务器有16GB物理内存,可设置为8GB(cacheSizeGB: 8)。该配置需在mongod.conf文件中修改,修改后重启服务生效。
vm.swappiness参数控制系统使用交换空间的倾向(范围0-100),建议设置为10或更低(如vm.swappiness=10),以减少内存不足时数据交换到磁盘的概率,提升性能。修改后需执行sysctl -p使配置生效。vm.overcommit_memory参数决定内核是否允许内存超额分配,建议设置为1(允许超额分配,但需谨慎使用),避免因内存申请过多导致系统崩溃。同样需修改/etc/sysctl.conf并执行sysctl -p持久化。_id、常用查询条件字段)创建索引,可避免全表扫描,减少内存中临时数据的存储。使用db.collection.createIndex({field: 1})创建索引,并通过explain()方法分析查询执行计划,确保索引被有效利用。limit()方法限制查询返回的文档数量(如db.collection.find().limit(10)),并通过投影操作符(如{field1: 1, field2: 1})明确指定返回字段,减少内存中加载的数据量。db.serverStatus().mem命令查看内存使用详情(包括缓存命中率、内存分配情况);mongostat监控内存使用趋势(如每秒查询内存占用);mongotop分析集合级别的读写时间,定位内存瓶颈。setParameter配置项限制内部查询的内存使用,避免单个查询占用过多内存导致系统崩溃。例如:internalQueryExecMaxBlockingSortBytes: 1073741824(限制阻塞排序操作的最大内存为1GB)、internalQueryExecMaxMemoryUsageMB: 2048(限制内部查询的最大内存为2GB)。blockdev --setra 32 /dev/sdX命令调整(sdX为数据盘设备名)。