Linux系统中MongoDB内存分配指南
MongoDB默认使用WiredTiger存储引擎(MongoDB 3.2+版本),其内存分配主要通过cacheSizeGB参数控制,该参数决定了WiredTiger引擎可使用的最大内存量(包括数据缓存、索引缓存等)。
/etc/mongod.conf),在storage.wiredTiger.engineConfig下添加或修改cacheSizeGB参数。例如,服务器有16GB物理内存时,建议设置为10-12GB(占总内存的60%-75%):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 10 # 单位为GB,需根据实际内存调整
--wiredTigerCacheSizeGB参数直接指定缓存大小(适用于临时测试或非配置文件管理的场景):mongod --wiredTigerCacheSizeGB 10 --dbpath /var/lib/mongo
注:配置文件修改后需重启MongoDB服务(
sudo systemctl restart mongod)使设置生效;命令行参数仅在当前启动实例中有效。
为避免MongoDB与其他进程竞争内存或因内存超额分配导致系统崩溃,需调整以下系统参数:
/proc/sys/vm/overcommit_memory文件(或通过sysctl.conf持久化),将其值设为1,允许内核允许内存超额分配(防止MongoDB因内存申请被拒绝而崩溃):echo 1 | sudo tee /proc/sys/vm/overcommit_memory
# 持久化设置(添加到/etc/sysctl.conf)
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # 使配置立即生效
vm.swappiness参数(范围0-100),降低系统使用交换空间(Swap)的倾向。建议设为10(值越小,越倾向于使用物理内存),以提升MongoDB的I/O性能:echo 10 | sudo tee /proc/sys/vm/swappiness
# 持久化设置(添加到/etc/sysctl.conf)
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
/etc/sysctl.conf中添加:vm.nr_hugepages = 0
sudo sysctl -p
注:HugePages通常用于需要大量连续内存的场景(如Oracle数据库),MongoDB默认使用普通内存页即可。
cacheSizeGB设置为超过服务器物理内存的80%(如16GB内存最多设为12-13GB),需预留足够内存给操作系统(内核、系统进程)、其他应用程序(如Nginx、Redis)及MongoDB自身的非缓存进程(如连接管理、查询解析)。过度分配会导致系统触发OOM Killer(Out-of-Memory Killer),终止MongoDB进程。mongostat:查看实时内存操作统计(如缓存命中率、读写次数);mongotop:查看集合级别的读写时间分布(定位慢查询);db.serverStatus().wiredTiger.cache:查看WiredTiger缓存的详细使用情况(如缓存命中率、脏页数量):mongo --eval 'db.serverStatus().wiredTiger.cache'
关键指标解读:bytes dirty(脏页数量,需定期刷入磁盘)、bytes dirty in the cache(脏页占缓存比例,建议不超过20%)、bytes read into cache(从磁盘读取到缓存的数据量,反映缓存命中率)。docker run -d --name mongodb -m 8g --memory-swap 8g mongo # 限制最大使用8GB内存(无Swap)
注:
--memory-swap设置为与-m相同的值表示禁用Swap(容器环境下建议禁用)。
修改配置后,需通过以下步骤验证是否生效:
sudo systemctl restart mongod
/var/log/mongodb/mongod.log),确认无内存相关错误(如“Cannot allocate memory”);db.serverStatus().wiredTiger.cache命令,检查cacheSizeGB是否与配置一致,以及缓存命中率是否达标(通常应高于90%)。