MongoDB默认使用WiredTiger存储引擎(推荐),其内存占用主要由cacheSizeGB参数控制。该参数定义了WiredTiger可使用的最大内存(包括数据缓存和索引缓存)。建议设置为系统可用内存的50%-80%(需预留足够内存给系统和其他应用),避免过度占用导致内存不足。
操作步骤:
/etc/mongod.conf):sudo nano /etc/mongod.conf
storage.wiredTiger.engineConfig section,修改cacheSizeGB(例如设置为4GB):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据系统内存调整
sudo systemctl restart mongod
注意:若使用旧版MMAPv1引擎(不推荐),可通过storage.mmapv1.smallFiles=true减少内存碎片,但性能不如WiredTiger。
低效查询(如全表扫描)会强制MongoDB加载大量数据到内存,导致内存压力增大。需通过索引和查询优化降低内存占用:
_id、username、timestamp)创建索引,避免全表扫描。例如:db.collection.createIndex({ "username": 1 }) // 为username字段创建升序索引
find()方法的第二个参数指定返回字段,减少内存加载量。例如:db.collection.find({ "status": "active" }, { "name": 1, "email": 1, "_id": 0 }) // 仅返回name和email字段
limit()方法控制查询结果数量,避免一次性加载过多数据。例如:db.collection.find().limit(100) // 仅返回前100条记录
explain()方法查看查询执行计划,确认是否使用了索引。例如:db.collection.find({ "username": "john" }).explain("executionStats")
若winningPlan中stage为COLLSCAN(全表扫描),需优化索引。vm.swappiness参数(默认60)决定了系统使用Swap空间的倾向。值越高,系统越倾向于将内存数据换出到Swap(会降低性能)。建议将vm.swappiness设置为0-10(生产环境推荐1),减少Swap对MongoDB的影响:sudo sysctl -w vm.swappiness=1 # 临时生效
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf # 永久生效
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
可将上述命令添加到/etc/rc.local中,实现开机自动禁用。通过systemd可限制MongoDB进程的最大内存使用,避免其占用全部系统内存。
操作步骤:
sudo systemctl edit mongod
[Service]
MemoryLimit=8G
sudo systemctl daemon-reload
sudo systemctl restart mongod
注意:限制值需大于cacheSizeGB,避免MongoDB因内存不足崩溃。
定期监控MongoDB内存使用情况,识别瓶颈并调整配置:
db.serverStatus().mem命令查看MongoDB内存使用详情(包括常驻内存、虚拟内存、缓存命中率等):mongo
> use admin
> db.serverStatus().mem
mongostat(实时监控命令)、mongotop(查看集合级读写时间)、Prometheus+Grafana(可视化监控)等工具,持续跟踪内存、磁盘IO、查询性能等指标。storage.wiredTiger.collectionConfig.blockCompressor参数启用压缩(如snappy、zlib),减少内存和磁盘占用。例如:storage:
wiredTiger:
collectionConfig:
blockCompressor: snappy # 推荐,平衡性能与压缩比
db.collection.dropIndex()),释放内存空间。通过以上策略的综合应用,可有效解决Linux环境下MongoDB内存不足的问题,提升数据库性能和系统稳定性。需根据实际业务场景和系统资源,灵活调整配置参数。