一、理解MongoDB内存分配的核心组件
MongoDB(3.2+版本默认使用WiredTiger存储引擎)的内存分配主要围绕WiredTiger缓存和操作系统内存管理展开。其中,WiredTiger缓存是MongoDB内存使用的核心,用于缓存数据和索引,直接影响查询性能;操作系统层面需调整swap、内存超额分配等参数,避免内存压力导致系统不稳定。
二、WiredTiger缓存大小设置(关键参数)
WiredTiger缓存的大小通过storage.wiredTiger.engineConfig.cacheSizeGB参数控制,单位为GB。推荐设置为服务器可用内存的60%-80%(可用内存=总内存-系统预留内存,如系统自身运行、其他服务所需内存)。例如:
cacheSizeGB为8-11GB(如cacheSizeGB: 10)。三、配置文件修改步骤
/etc/mongod.conf(若为容器化部署,需进入容器修改对应配置文件)。vi、nano)打开mongod.conf,找到storage部分,添加或修改wiredTiger.engineConfig.cacheSizeGB参数。示例如下:storage:
dbPath: /var/lib/mongo # 数据存储路径(无需修改)
journal:
enabled: true # 日志功能(建议开启)
wiredTiger:
engineConfig:
cacheSizeGB: 10 # 设置缓存大小为10GB
vi中按:wq)。四、操作系统级别优化
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
持久化设置:将上述命令添加到/etc/rc.local文件中(需赋予执行权限chmod +x /etc/rc.local)。vm.swappiness参数控制系统使用交换空间的倾向,建议设置为1(范围0-100,值越小越倾向于使用物理内存)。执行以下命令:echo 1 | sudo tee /proc/sys/vm/swappiness
echo "vm.swappiness = 1" >> /etc/sysctl.conf # 持久化设置
sudo sysctl -p # 使配置生效
vm.overcommit_memory参数控制内核是否允许内存超额分配,建议设置为1(允许超额分配,避免MongoDB因内存申请失败而崩溃)。执行以下命令:echo 1 | sudo tee /proc/sys/vm/overcommit_memory
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf # 持久化设置
sudo sysctl -p # 使配置生效
五、验证配置生效
sudo systemctl restart mongod
mongo --eval 'db.serverStatus().wiredTiger.cache'
输出结果中的bytes dirty(脏页数量)、bytes valid(有效缓存数量)、maximum bytes configured(配置的最大缓存大小)等指标,可验证缓存设置是否生效。六、注意事项
cacheSizeGB超过系统可用内存,会导致操作系统频繁使用swap(即使swappiness设置为1),严重影响性能。mongostat(监控操作速率)、mongotop(监控集合级读写时间)等工具监控内存使用情况,根据业务增长调整缓存大小。--memory参数限制容器内存,并调整cacheSizeGB不超过容器内存限制(如docker run --memory="16g" ...)。