MongoDB在Ubuntu上的内存使用机制与优化
MongoDB在Ubuntu上的内存使用主要分为两部分,均与存储引擎(默认为WiredTiger)相关:
cacheSizeGB
参数控制,是MongoDB用于缓存工作集(索引、查询结果、未写入磁盘的脏页等)的核心内存区域。其大小直接影响数据库读写性能——较大的缓存可减少磁盘I/O,但过大会导致系统内存不足(触发OOM Killer)。修改MongoDB配置文件(/etc/mongod.conf
),在storage.engine.wiredTiger.engineConfig
下设置cacheSizeGB
参数。建议值为系统总内存的50%-70%(如8GB内存可设置为4-5GB),避免占用过多内存导致系统不稳定。
示例配置:
storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据系统内存调整
若在容器中运行MongoDB,需通过容器资源限制控制内存使用(如Docker的-m
参数)。需注意:容器内的cacheSizeGB
需小于容器内存限制,且容器总内存应预留10%-20%给系统和其他进程(如日志、监控)。
示例命令(限制容器最大内存为4GB):
docker run -m 4g --memory-swap 1g mongo
通过MongoDB Shell执行以下命令,获取WiredTiger缓存的详细使用情况(如已使用内存、脏页数量、evicted页面数):
db.serverStatus().wiredTiger.cache
关键指标说明:
bytes currently in the cache
:当前缓存中占用的内存;bytes dirty in the cache
:待写入磁盘的脏页大小;pages evicted by application threads
:应用程序线程驱逐的页面数(过高说明缓存不足)。使用top
或htop
命令查看MongoDB进程的内存占用(RES
列表示进程占用的物理内存,SHR
列表示共享内存):
top -p $(pgrep mongod)
或使用free
命令查看系统Page Cache使用情况:
free -h
cacheSizeGB
);若工作集大且I/O压力小,可增大cacheSizeGB
。bytes dirty in the cache
过高),会导致写回时卡顿。可通过修改系统参数调整脏页写回阈值:sysctl -w vm.dirty_background_ratio=5 # 后台写回阈值(5%)
sysctl -w vm.dirty_ratio=10 # 强制写回阈值(10%)
mongostat
、mongotop
或第三方监控工具(如Prometheus+Granafa)实时监控内存使用情况,及时调整配置。