MongoDB默认使用WiredTiger存储引擎(推荐),其内存使用主要由cacheSizeGB参数控制,该参数决定了WiredTiger用于缓存数据和索引的内存上限。
配置步骤:
sudo nano /etc/mongod.confstorage.wiredTiger.engineConfig section,添加或修改cacheSizeGB参数(单位:GB)。storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8 # 根据服务器内存调整
sudo systemctl restart mongod。vm.overcommit_memory参数控制内核是否允许内存超额分配(即申请超过物理内存的内存)。设置为1可避免MongoDB因内存分配失败而崩溃(适用于生产环境)。
操作命令:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory # 临时生效
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf # 永久生效
sudo sysctl -p # 加载配置
vm.swappiness参数控制系统使用交换空间(Swap)的倾向,值越低越倾向于使用物理内存。建议设置为10(默认值为60),减少Swap对MongoDB性能的影响(Swap会导致磁盘I/O升高,降低数据库响应速度)。
操作命令:
echo 10 | sudo tee /proc/sys/vm/swappiness # 临时生效
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf # 永久生效
sudo sysctl -p # 加载配置
通过setParameter配置内部查询的内存限制,避免单个查询占用过多内存导致系统崩溃:
internalQueryExecMaxBlockingSortBytes:限制阻塞排序操作的最大内存(默认1GB,可根据需求调整,例如2GB);internalQueryExecMaxMemoryUsageMB:限制内部查询的最大内存使用量(默认100MB,例如设置为2048MB)。setParameter:
internalQueryExecMaxBlockingSortBytes: 2147483648 # 2GB
internalQueryExecMaxMemoryUsageMB: 2048 # 2GB
mongostat --host localhost --port 27017 # 监控内存及操作统计
mongotop --host localhost --port 27017 # 监控集合级内存使用
通过db.serverStatus().wiredTiger.cache命令查看WiredTiger缓存的详细使用情况,包括:
bytes dirty:脏数据大小(等待写入磁盘的内存);bytes valid:有效缓存数据大小(已加载到内存的索引/数据);bytes dirty + bytes valid:当前缓存使用总量。use admin
db.serverStatus().wiredTiger.cache
cacheSizeGB设置过大可能导致系统频繁使用Swap(即使swappiness设置较低),反而降低性能;cacheSizeGB参数(例如每季度一次);