Linux下MongoDB内存问题的定位与治理
一 先判断是否为“真问题”
db.serverStatus().wiredTiger.cache 查看命中率与使用情况。另需区分 VIRT(虚拟内存)与 RES(常驻内存),以及 Linux 会把大量文件页计入 buff/cache,这部分是可回收的,不能简单等同于内存泄漏。建议用 free -m、top/htop、sar -r/sar -W 观察真实压力与换页情况。二 立即可用的配置与系统层限制
/etc/mongod.conf 中设置 storage.wiredTiger.engineConfig.cacheSizeGB,建议为物理内存的50%–60%,为操作系统和其他进程预留空间。示例:storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4.0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
建议写入系统启动脚本或发行版提供的 tuned 配置以持久化。allowDiskUse: true,并为高频查询建立合适索引、使用投影减少返回字段,避免无索引的大扫描与内存排序。--memory=4g),为 MongoDB 设置硬性边界,避免影响同机其他服务。三 查询与数据模型优化
四 架构与容量扩展
sh.enableSharding("myDatabase")
sh.shardCollection("myDatabase.myCollection", { "shardKey": 1 })
五 监控与应急
mongostat、mongotop 观察操作延迟、扫描与命中率;结合 db.serverStatus().wiredTiger.cache 查看缓存命中、脏页与逐出情况;在系统层面用 free、sar -r/-W 观察内存与换页趋势,避免因 Swap 颠簸导致性能骤降。sysctl -w vm.drop_caches=1 清理可回收页缓存(仅影响文件系统缓存,不影响 WiredTiger 缓存),或在万不得已时滚动重启 mongod 释放内存映射;在分片集群中可用 db.runCommand({flushRouterConfig: 1}) 刷新路由缓存。上述手段仅作临时缓解,根因仍需通过限流、优化与扩容解决。