一、核心内存配置:WiredTiger缓存设置
CentOS上MongoDB(默认使用WiredTiger存储引擎)的内存优化关键是合理配置WiredTiger缓存大小,该缓存用于存储工作集数据(常用索引、热文档),直接影响查询和写入性能。配置路径为/etc/mongod.conf,关键参数如下:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 单位为GB,需根据服务器内存调整
设置建议:
cacheSizeGB范围为256MB-10TB,可设置为浮点数(如2.5GB)。二、系统级内存优化设置
关闭Transparent HugePages(THP)
THP会导致内存碎片化,影响MongoDB性能。需编辑/etc/sysctl.conf文件,添加以下配置并生效:
vm.swappiness = 0 # 禁止交换分区(若内存充足,可设为0;若内存紧张,可设为1-10)
vm.nr_hugepages = 0 # 关闭THP
执行sudo sysctl -p使配置生效。
调整Swappiness参数
vm.swappiness控制内核使用交换分区的倾向(0-100,默认60)。设为0可避免MongoDB内存被交换到磁盘(仅在内存充足时推荐),若内存紧张可设为1-10(允许少量交换,防止OOM)。
三、可选:使用Systemd限制内存
若需强制限制MongoDB进程的内存使用(防止内存泄漏),可通过Systemd设置内存限制(如10GB):
sudo systemctl set-property mongod MemoryLimit=10G
此设置需重启MongoDB服务生效,且需确保MemoryLimit大于cacheSizeGB(避免缓存被截断)。
四、内存配置验证与监控
验证配置是否生效
修改mongod.conf后,重启MongoDB服务:
sudo systemctl restart mongod
执行以下命令查看缓存大小是否设置成功:
mongo --eval 'db.serverStatus().wiredTiger.cache'
输出中的bytes currently in the cache应接近配置的cacheSizeGB值。
日常监控内存使用
db.serverStatus().mem查看内存使用详情(如resident表示物理内存使用量、virtual表示虚拟内存使用量)。mongostat监控缓存命中率(cache miss比例过高需调整缓存大小)。top/htop查看系统内存使用情况,确保MongoDB未占用过多内存导致系统卡顿。五、其他内存优化建议
合理使用索引
为常用查询字段创建索引(如db.collection.createIndex({field: 1})),减少全表扫描,降低内存中的工作集大小。
优化查询语句
避免$where、$all等低效操作,使用投影(projection)限制返回字段,减少内存占用。
增加物理内存
若监控发现cache miss率持续过高(如超过10%),或MongoDB频繁使用交换分区(swap值增长),需考虑增加服务器物理内存。