CentOS下MongoDB内存如何分配
导读:CentOS下MongoDB内存分配与调优 一 内存分配机制与默认值 使用WiredTiger存储引擎时,MongoDB通过参数storage.wiredTiger.engineConfig.cacheSizeGB限制其“数据库页缓存”。...
CentOS下MongoDB内存分配与调优
一 内存分配机制与默认值
- 使用WiredTiger存储引擎时,MongoDB通过参数storage.wiredTiger.engineConfig.cacheSizeGB限制其“数据库页缓存”。在假定单实例占用整机的场景下,默认值为可用物理内存的50%;若同机运行多个实例或处于容器/cgroups中,应相应下调,避免相互抢占。除缓存外,MongoDB还会使用内存用于连接、排序、聚合、WiredTiger内部结构与会话等,因此总内存占用通常高于cacheSizeGB。WiredTiger缓存只缓存数据/索引的“页”,并非全部工作集,工作集应尽量通过足够内存或分片/副本集来容纳。
二 在CentOS上配置WiredTiger缓存
- 编辑配置文件**/etc/mongod.conf**,在storage.wiredTiger下设置cacheSizeGB(单位GB)。示例(将缓存设为约4GB):
storage: dbPath: /var/lib/mongo journal: enabled: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 4 - 动态设置(不重启,立即生效,重启后失效,建议写入配置以持久化):
db.adminCommand({ setParameter: 1, wiredTigerEngineRuntimeConfig: "cache_size=4294967296" // 单位字节,示例为4GB } ) - 应用与验证:
- 重启服务:
sudo systemctl restart mongod - 验证配置:
mongo --eval 'db.serverStatus().mem' - 查看WiredTiger缓存命中/使用:
db.serverStatus().wiredTiger.cache
- 重启服务:
- 容量建议:单机单实例可将cacheSizeGB设为物理内存的40%—50%;同机多实例或容器环境按可用份额下调,并预留2—4GB给操作系统与其他进程。
三 操作系统与内核参数建议
- 降低换页倾向(减少swap使用,避免数据库抖动):
sudo sysctl vm.swappiness=1(或在/etc/sysctl.conf中持久化)
- 控制内存过量提交策略(可选,降低OOM风险波动):
sudo sysctl vm.overcommit_memory=2
- 关闭透明大页(THP,减少内存碎片与延迟波动):
- 临时:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled - 持久化:在
/etc/rc.local或systemd服务中执行相同命令,或按发行版文档配置
- 临时:
- 文件描述符与网络(避免连接数受限):
- limits.conf:
* soft nofile 65536、* hard nofile 65536 - sysctl:
net.core.somaxconn=65535、net.ipv4.ip_local_port_range=1024 65535
- limits.conf:
- 应用变更:
sudo sysctl -p并重启MongoDB服务。
四 监控与容量规划
- MongoDB自带工具:
mongostat --all:观察mem.resident(常驻内存)、page_faults、队列与连接等指标mongotop:按集合查看读写耗时db.serverStatus().mem:查看内存使用概览db.serverStatus().wiredTiger.cache:查看WiredTiger缓存命中率、脏页比例、最大/已用缓存等
- 规划要点:
- 让工作集(working set)尽量常驻内存;若超出内存,优先考虑加内存、优化索引/查询、分片/副本集等手段
- 避免将cacheSizeGB设置过高,需为操作系统、文件系统页缓存、连接与后台任务预留空间。
五 常见场景与注意事项
- 单机多实例/容器:按实例数均分内存,并各自设置合适的cacheSizeGB;容器环境可用cgroups/容器内存限制兜底
- 高排序/聚合内存:通过索引与查询改写降低内存占用;必要时调小排序/聚合相关内存阈值,避免占用过多工作内存
- 副本集/分片:通过水平扩展分摊工作集与连接压力,降低单实例内存瓶颈
- 是否开启Swap:开启可在内存紧张时避免OOM,但会带来显著变慢;生产上更推荐充足内存+监控告警+合理上限,必要时再考虑少量swap作为缓冲。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS下MongoDB内存如何分配
本文地址: https://pptw.com/jishu/763062.html
