CentOS下MongoDB内存溢出处理与优化
一、先判断是否为真正的内存问题
free -m、top/htop、vmstat 1 10,观察 available 是否长期偏低、si/so(swap 换入/换出)是否持续不为 0,以及 mongod RES 是否逼近或超过物理内存。mongostat --all(关注 mem.resident、qr/qw、faults)、mongotop(关注集合读写耗时),定位是否存在慢查询、全表扫描或连接堆积。/var/log/mongodb/mongod.log,若出现 WT_PANIC / Cannot allocate memory / out of memory,多为 WiredTiger 缓存或系统内存不足导致的异常。storage.wiredTiger.engineConfig.cacheSizeGB 时,WiredTiger 默认大约会使用 (系统内存 − 1GB) / 2;设置该参数后,WiredTiger 缓存上限约为 cacheSizeGB − 1GB。注意:WiredTiger 缓存只是 MongoDB 内存的一部分,查询、排序、连接栈等仍会占用额外内存,因此限制 cache 并不能完全阻止进程 RSS 上升。二、立即可用的缓解措施
systemctl restart mongod。该值应小于机器可用内存,并预留给操作系统与其他进程。systemctl set-property mongod MemoryLimit=8G(服务名可能为 mongod 或自定义),用于触发 OOM killer 前的内存上限保护。db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes: 104857600})(示例 100MB)。db.adminCommand({setParameter:1, internalQueryExecMaxMemoryUsageMB: 512})(示例 512MB)。sync && echo 3 > /proc/sys/vm/drop_caches。这会清理 pagecache/dentries/inodes,可能短时降低 RSS,但会引入额外磁盘 IO,且并不能解决根本的内存压力。systemctl restart mongod 快速恢复服务可用性。三、根因治理与配置优化
mongostat 观察 qr/qw 队列是否堆积。vm.swappiness(如 10),减少换页倾向:sysctl vm.swappiness=10。vm.overcommit_memory(如 2),降低内存过度承诺带来的 OOM 风险:sysctl vm.overcommit_memory=2。修改后写入 /etc/sysctl.conf 持久化。四、参数建议与容量示例
cacheSizeGB: 7。计算公式:WiredTiger 可用缓存 ≈ cacheSizeGB − 1GB;未设置时约为 (16 − 1)/2 = 7.5GB。cacheSizeGB 设为 14–15GB(示例 14GB),为操作系统与其他进程预留充足内存。五、快速排查清单
free -m、top/htop、vmstat 1 10,确认是否真实内存紧张与 swap 抖动。mongostat --all、mongotop,定位慢查询、全表扫描、连接堆积。mongod.log 是否存在 WT_PANIC / out of memory 等致命错误。cacheSizeGB 是否合理,是否预留足够系统内存。systemctl status mongod、coredump 与慢查询日志进一步定位。