调整Ubuntu上MongoDB的内存设置主要是通过修改其核心配置文件mongod.conf,优化WiredTiger存储引擎缓存(默认存储引擎)及其他内存相关参数,以提升数据库性能。以下是详细步骤及注意事项:
MongoDB的主配置文件默认位于/etc/mongod.conf,可通过以下命令确认其路径:
sudo systemctl status mongod
输出中的--config字段会显示配置文件位置(通常为/etc/mongod.conf)。
在mongod.conf中,**storage.wiredTiger.engineConfig.cacheSizeGB**是控制MongoDB内存使用的关键参数,用于设置WiredTiger存储引擎的缓存大小(单位:GB)。
storage部分,添加或修改wiredTiger.engineConfig.cacheSizeGB,例如:storage:
engine: wiredTiger # 确保使用WiredTiger引擎(默认)
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据系统内存调整(如4GB)
除cacheSizeGB外,还可通过以下参数进一步优化内存使用:
setParameter.internalQueryExecMaxBlockingSortBytes:限制内部查询的最大阻塞排序内存(单位:字节),避免单个查询占用过多内存。例如设置为1GB:setParameter:
internalQueryExecMaxBlockingSortBytes: 1073741824 # 1GB
setParameter.internalQueryExecMaxMemoryUsageMB:限制内部查询的最大内存使用量(单位:MB),防止查询过度消耗内存。例如设置为2GB:setParameter:
internalQueryExecMaxMemoryUsageMB: 2048 # 2GB
这些参数可根据查询负载调整,避免因单个查询导致内存溢出。
修改配置文件后,需重启MongoDB服务使更改生效:
sudo systemctl restart mongod
重启后,可通过以下命令检查服务状态(确保无报错):
sudo systemctl status mongod
方法1:通过MongoDB命令查看WiredTiger缓存状态
连接到MongoDB shell,执行以下命令:
db.serverStatus().wiredTiger.cache
输出中的bytes dirty(脏页字节数)、bytes valid(有效缓存字节数)等字段可反映缓存使用情况。
方法2:查看系统进程内存使用
使用top或htop命令,过滤mongod进程,查看其RES(常驻内存)字段,确认内存占用是否符合预期:
top -p $(pgrep mongod)
为避免MongoDB与其他进程竞争内存,可调整以下系统参数:
vm.overcommit_memory:设置为1(允许内存超额分配),减少内存分配失败的概率:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
持久化设置(添加到/etc/sysctl.conf):
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
vm.swappiness:设置为10(降低交换空间使用倾向),减少磁盘I/O对性能的影响:
echo 10 | sudo tee /proc/sys/vm/swappiness
持久化设置:
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
cacheSizeGB不应超过系统物理内存的80%,否则可能导致系统内存不足,引发OOM(Out of Memory)错误。mongostat(监控操作统计)、mongotop(监控集合级读写)等工具跟踪内存使用情况,根据业务增长调整参数。-m参数限制容器内存(如docker run -m 4g mongo),但需确保容器内mongod.conf的cacheSizeGB不超过容器内存限制。通过以上步骤,可有效调整Ubuntu上MongoDB的内存设置,平衡数据库性能与系统资源利用率。