CentOS 上 MongoDB 内存管理实践
一 内存管理机制与关键认知
- 在 WiredTiger 引擎下,MongoDB 将索引与数据文件通过操作系统提供的 内存映射(mmap) 进行管理,数据页由内核按需调入/换出,应用侧通常无需也无法精确控制这些页的释放时机。因此看到 RSS 长时间较高 多为正常缓存行为,并不代表内存泄漏。若确需限制进程可用内存,应在系统或服务层面设置上限,而非依赖应用主动“释放”。
二 配置 WiredTiger 缓存上限
- 在 /etc/mongod.conf 中显式设置缓存上限(推荐做法),避免无限制增长。经验值为“留出给系统与其他进程的内存后,再分配给 WiredTiger 缓存”。例如总内存 16GB 的实例,可先预留 8GB 给系统与其他服务,将缓存设为约 7.5GB:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 7.5
db.adminCommand({
setParameter: 1,
internalQueryExecMaxBlockingSortBytes: 104857600,
internalQueryExecMaxMemoryUsageMB: 512
})
- 修改配置后建议重启以稳定生效:
systemctl restart mongod。上述做法既能限制 MongoDB 的“主动缓存”占用,也能为操作系统和其他进程保留足够内存,降低换页与抖动风险。
三 操作系统层控制与稳定性优化
- 降低换页倾向:将 vm.swappiness 调低(如 10),减少内核主动换出 MongoDB 页的概率。
- 内存过量使用策略:将 vm.overcommit_memory 设为 2,在内存紧张时更保守地分配,降低 OOM 风险(需结合容量规划谨慎设置)。
- 透明大页(THP):建议关闭或设置为 madvise,避免长时运行下的延迟抖动与额外内存占用。
- cgroups/systemd 硬上限:为 mongod 服务设置 MemoryLimit(例如 10G),当进程超过上限将被 OOM Killer 终止或被限流,适合多实例或与其他服务共存的场景。
- 监控与诊断:使用 mongostat、mongotop 观察吞吐与热点,配合 top/htop、free -m 查看系统层内存与换页情况,必要时结合日志与慢查询定位异常查询与索引缺失。
四 常见操作与取舍
- 不建议通过 重启 mongod 来“释放内存”,这只能临时清空缓存,无法解决根因,且会影响业务连续性。
- 如需在维护窗口“安全清理”并重建数据文件映射,可在确保数据安全的前提下使用 mongodump/mongorestore 重建,但这属于重操作,成本高、时间长,仅作权衡后的方案。
- 若必须快速回收页缓存(仅在确认无业务影响时),可在维护窗口执行:
sync && echo 3 > /proc/sys/vm/drop_caches;此举会清空页缓存,可能导致短时 I/O 升高,生产环境慎用。