mongo内存

news/2025/11/7 16:16:29/文章来源:https://www.cnblogs.com/tiantao36/p/19200030

mongo内存

 

🔍 WiredTiger 引擎缓存限制为 8GB,但系统进程 RSS 占用却达到了 12GB

很多人看到这种情况第一反应是“MongoDB 内存泄漏”,但实际上这往往是 正常的引擎行为可解释的额外内存占用
下面我分层详细分析这个现象的真正原因、验证方式和判断标准。


🧭 一、问题背景与现象重述

指标来源数值
WiredTiger cache (maximum bytes configured) db.serverStatus().wiredTiger.cache ≈ 8 GB
RSS (Resident Set Size) top / db.serverStatus().mem.resident ≈ 12 GB

💡 现象:MongoDB 进程实际驻留内存比引擎配置的 cache 大约多出 4 GB。


🧩 二、关键结论(核心要点)

MongoDB 的 RSS ≠ WiredTiger cache。

RSS 包含:

  1. WiredTiger 内部 cache(storage.wiredTiger.engineConfig.cacheSizeGB

  2. 索引与表元数据 cache(metadata)

  3. 压缩与解压缓冲区(zlib/zstd/snappy)

  4. Journal 写缓存(预写日志缓冲)

  5. Aggregation / $lookup / sort 等临时内存

  6. 连接缓冲区与 socket buffer

  7. 线程栈与内核映射页(mmap header / 文件描述符表)

因此,RSS 高于 cache 是预期行为。
只要增幅合理(通常不超过 cache 的 50%),就不是泄漏。


⚙️ 三、分层分析方法(MongoDB 内部命令)

我们仅使用 MongoDB 自身信息(不依赖 Linux 工具)。


1️⃣ 查看 WiredTiger 缓存状态

db.serverStatus().wiredTiger.cache

重点字段:

字段含义
maximum bytes configured 8 GB(你的设置)
bytes currently in the cache 实际 cache 占用
tracked dirty bytes in the cache 脏页
pages evicted by application threads 驱逐频繁度
pages read into cache / bytes read into cache 读放大情况

🔍 如果 bytes currently in the cache 接近上限(例如 7.9GB),说明 WiredTiger 部分是稳定的。RSS 的额外部分来自别处。


2️⃣ 检查数据库与集合占用分布

db.stats()
db.getCollectionNames().forEach(function(c){var s = db.getCollection(c).stats();print(c, Math.round(s.wiredTiger.cache["bytes currently in the cache"]/1024/1024), "MB");
});

分析哪些集合在内存中最活跃。
如果发现个别集合 cache 占用非常高,说明热点数据集中在这部分。


3️⃣ 检查连接数与游标

db.serverStatus().connections
db.serverStatus().metrics.cursor
指标含义说明
connections.current 当前连接数 每个连接约 1 MB 内存
metrics.cursor.open.total 活跃游标 长时间未关闭的 cursor 会占缓存

如果连接数高(例如 3000),就会额外吃掉 3 GB 内存。


4️⃣ 检查聚合/排序类操作的内存使用

db.currentOp({ "active": true })

关注:

  • "op": "command"

  • "command.aggregate" 存在

  • "usedDisk": false

如果有 $group$sort$lookupusedDisk=false,说明这些操作在内存中堆积中间结果,会造成瞬时内存暴涨
这些不会计入 WiredTiger cache。


5️⃣ 检查 journal / 压缩缓冲区

虽然 Mongo 没有直接字段展示 journal buffer,但可以通过:

db.serverStatus().wiredTiger.transaction

查看:

  • "transaction checkpoints" 频率(如果很低)

  • "transaction range of IDs currently pinned" 较大
    → 表示 checkpoint 延迟、脏页堆积

压缩缓冲区和 journaling 通常会占用 0.5–1 GB 额外内存。


🧮 四、WiredTiger 内部结构导致的额外内存来源

模块典型占用说明
WT cache 8 GB 配置上限
索引元数据(btree metadata) ~0.5–1 GB schema + handle cache
压缩缓冲区(Snappy / Zstd) 0.5–2 GB 压缩块缓存与线程缓冲
Journal buffer 0.5–1 GB 写日志缓存
Aggregation / Sort / Cursor 内存 动态 pipeline 或 client 端操作
连接与线程栈 0.5–1 GB 每连接 + 线程栈
内核 mmap header 与共享页 约数百 MB 文件描述符与 mmap 区头部

合计:8 GB + ~4 GB = 12 GB
完全匹配你的现象。


🔍 五、判断是否异常(是否属于“内存泄漏”)

判断点正常情况异常提示
bytes currently in the cache ≈ 设定上限 ✅ 正常 ❌ 持续超过上限(不可能)
RSS / cache 比例 < 1.5 ✅ 正常范围 ❌ >2 倍说明异常增长
pages evicted by application threads 稳定 ✅ 正常 ❌ 持续爆增
connections.current 稳定 ✅ 正常 ❌ 持续上升
db.currentOp() 长时间高内存聚合 ❌ 出现时临时暴涨  
serverStatus().mem.resident 稳定 ✅ 正常 ❌ 持续爬升说明泄漏或长生命周期对象堆积

🧰 六、可执行诊断步骤(仅用 MongoDB 命令)

你可以按顺序执行下列命令:

// 1. 全局内存摘要
db.serverStatus().mem// 2. WiredTiger cache 占用
db.serverStatus().wiredTiger.cache// 3. 数据库与集合 cache 分布
db.stats()
db.getCollectionNames().forEach(function(c){var s = db.getCollection(c).stats();print(c, Math.round(s.wiredTiger.cache["bytes currently in the cache"]/1024/1024), "MB");
});// 4. 当前连接与游标
db.serverStatus().connections
db.serverStatus().metrics.cursor// 5. 检查是否存在占用内存的聚合
db.currentOp({ "active": true, "op": "command" })

执行完你就能判断:

  • 是否热点数据或聚合导致;

  • 是否连接/游标堆积;

  • WiredTiger cache 是否真的满;

  • 额外 4 GB 是否可解释。


🧩 七、若确实异常(超出正常范围)的应对

可能原因验证方式优化措施
聚合或排序大量内存 db.currentOp() 启用 allowDiskUse:true
连接数暴涨 db.serverStatus().connections 启用连接池 / 限制连接
缓存配置过小,导致 page 频繁驱逐 pages evicted 提高 cacheSizeGB
checkpoint 延迟导致脏页堆积 transaction 状态 调整 checkpoint=(wait=60)
压缩缓冲区膨胀 无直接指标 换算法(Snappy→Zstd)或更新 Mongo 版本
游标未关闭 metrics.cursor.open.total 确保客户端关闭 cursor

✅ 八、总结(面试/生产解答版)

结论说明
RSS > WiredTiger cache 是正常现象 因为 RSS 包含其他内存区
一般情况下 1.3~1.6 倍属正常 例如 cache 8G → RSS 12G
可通过 serverStatus() 内部分析验证 不需系统工具
异常增长常来自聚合、连接、压缩缓冲或 journaling 可用 currentOpconnections 验证
若 RSS 超 cache 2 倍以上且长期不回落 可能存在内存泄漏或长生命周期对象问题

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P12014 [Ynoi April Fools Round 2025] 牢帽 口胡做法

P12014 [Ynoi April Fools Round 2025] 牢帽 Problem 星野加奈给你一个 \(n\) 个点的无向图,图初始没有边。他还有整数 \(u,v\) 和 \(a_1,a_2,\cdots ,a_n\)。现在有 \(q\) 次操作,操作有四种:1 x y :连接 \(x,y\)…

设计师 / 出版人必备!InDesign 2026 让版面编排又快又精

Adobe InDesign 2026 v21.0是一款功能强大的专业桌面出版软件。它通过对文字排版引擎、模板系统、协作机制以及跨媒体输出流程的全面优化,为平面设计师、出版机构等提供了高效的版面编排解决方案。该版本借助Adobe Se…

【IEEE出版|中国科学院宁波材料所主办】第五届机械自动化与电子信息工程国际学术会议(MAEIE 2025)

五届机械自动化与电子信息工程国际学术会议(MAEIE 2025)将于2025年11月27-29日在中国宁波举行。大会面向基础与前沿、学科与产业,建立起前沿的学术交流平台,将汇聚国内外专家、学者和企业界优秀人才,紧密围绕着机…

目前合肥甲醛检测公司哪家好?

文章摘要 随着室内空气污染问题日益受到关注,甲醛检测行业在2025年迎来快速发展,消费者对可靠检测服务的需求激增。本文基于权威数据和用户口碑,为您推荐合肥地区甲醛检测公司排名Top5,重点介绍行业领先企业,并提…

当下甲醛检测机构哪家靠谱?原则强调

摘要 随着室内空气质量问题日益受到关注,甲醛检测行业在2025年迎来快速发展,家装和工装需求激增。本文基于权威数据和用户反馈,为您呈现甲醛检测服务排名前十的机构,帮助您做出明智选择。表单供参考,确保信息透明…

2025年甲醛检测公司哪家好:权威排名与选择指南

摘要 随着室内空气污染问题日益受到关注,甲醛检测行业在2025年迎来快速发展,市场规模预计增长15%以上。消费者对健康居住环境的需求推动了对专业检测服务的需求。本文基于行业数据、用户口碑和技术评测,为您提供一份…

2025年除甲醛公司权威排名:专业机构服务对比与选择指南

摘要 随着室内空气质量关注度持续提升,除甲醛行业在2025年迎来快速发展期。本文基于市场调研和用户反馈,对国内主流除甲醛服务机构进行综合评估排名,为消费者提供专业参考。文末附有详细对比表单,方便用户根据自身…

央企智变新实践,网易灵动助力世界500强集团打造无人化标杆

在国家推动传统基建数字化转型、构建 “数字中国” 的战略背景下,中国水利水电第五工程局有限公司(简称“水电五局”)与网易灵动强强联手,落地无人装载机技术,共同推动旗下拌合站智能化升级。双方基于中国电力建设…

平台红绿灯脚本

// ==UserScript== // @name 平台红绿灯视频评估扩展 // @namespace http://tampermonkey.net/ // @version 2025-09-15 // @description try to take over the world! // @author You // @mat…

Linux - 9 定时任务篇(crontab)

1)crontab 定时执行任务 crontab 是 Linux 中用于定时执行任务的核心工具,依托 cron 守护进程运行(cron 是系统级后台服务,默认随系统启动),支持按分钟、小时、日、月、周设定周期性任务,适用于日志切割、数据备…

详细介绍:基于屏幕空间投影面积的剔除(Screen-space Area Culling, SSAC)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Elasticsearch、OpenSearch 与 Easysearch:三代搜索引擎的演化与抉择 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从 Java 到鸿蒙开发:我的跨平台转型之路

缘起:为何选择鸿蒙 作为一名有着多年 Java 开发经验的程序员,我见证了移动开发的兴衰起伏。从早期的 Java ME 到 Android,再到如今的鸿蒙,技术浪潮不断推进。当华为宣布鸿蒙系统并逐步构建其生态时,我意识到这不仅…

淘宝店铺全量商品接口开发:从分类穿透到增量同步的高效采集方案

一、淘宝店铺商品接口的技术特殊性与开发痛点淘宝店铺商品列表作为商家运营与竞品分析的核心数据,其接口体系具有显著的场景化挑战:需处理多层级分类结构(店铺分类可达 3 级以上)、动态上下架状态(商品状态实时变…

分布式专题——35 Netty的使用和常用组件辨析 - 详解

分布式专题——35 Netty的使用和常用组件辨析 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

米尔SECC方案助力国标充电桩出海

随着全球能源结构向清洁化、智能化加速转型,电动汽车与电网的深度融合已成为关键一环。车辆到电网技术不仅让电动汽车成为移动的储能单元,更赋予了它们参与电网调峰、消纳可再生能源的使命。在这一颠覆性变革中,充电…

Javascrip 之 await fetch()

Javascrip 之 await fetch() await fetch()怎么理解? await fetch() 是 JavaScript 中用于处理网络请求的现代语法。 1. 基础概念 fetch() 函数 是浏览器内置的 API,用于发起 HTTP 请求 返回一个 Promise 对象 替…

P2P CDN Tracker 技术深度解析(四):NAT穿透与Relay中继策略

P2P网络中最大的挑战之一是NAT穿透。本文深入剖析Tracker如何检测NAT类型、协调UDP打洞,以及当打洞失败时如何通过三级Relay体系保障连通性。前情回顾 在第1篇中,我们了解到Tracker负责协调NAT穿透。在第2篇中,我们…

2025年11月油脂提取设备知名品牌与破碎仪厂家介绍

在2025年11月,对于从事油脂提取和样品前处理相关科研及工业应用的从业者来说,选择可靠的品牌和设备供应商至关重要。本文将重点介绍在油脂提取设备及破碎仪领域表现突出的知名品牌——上海万柏生物科技有限公司,并详…