MongoDB内存过高问题分析解决

ccdb941d394c0667e5a7a926946efb49.jpeg

告警

公司有个3.2.7版本的mongo复制集,最近几天频繁告警内存过高。

服务器配置16C+64G内存。mongo备节点内存使用到55G,触发告警。

以下内容基于3.2.7版本,3.2.7版本已经太老,很多后来的命令和配置,3.2.7都没有。

排查

排查mongo配置

主要是检查cacheSizeGB

wiredTiger:
engineConfig:
cacheSizeGB: 20

MongoDB 3.2 及以后,默认使用 WiredTiger 存储引擎,可通过 cacheSizeGB 选项配置 WiredTiger 引擎使用内存的上限,一般建议配置在系统可用内存的一班左右。

默认值是(RAM – 1GB) / 2。出发点是防止系统OOM kill。因为这里的配置只是wiredTiger的内存cache限额,并不是mongo的全部使用内存限额,整个mongo进程的内存占用要比这个值大,所以cacheSizeGB万万不可设置超过RAM的60%。

我们这里配置到了20G。但是实际运行中发现,在并发查询很高的情况下,wt的cacheSize还是会超过这个配置一点点。

查看mongo实例的内存使用情况

db.serverStatus().wiredTiger.cache

返回结果中 bytes currently in the cache 后的值为缓存数据的大小

...
"bytes currently in the cache" : 21483838298,
...

已经用满了,这种情况可以加一下内存了。但是内存太贵,业务也没有那么高的性能要求,保障不宕机是更有性价比的方案。

既然cache只用了20G,

看看tcmalloc的情况

db.serverStatus().tcmalloc
------------------------------------------------
MALLOC: 22351254936 (21315.8 MiB) Bytes in use by application
MALLOC: + 24922800128 (23768.2 MiB) Bytes in page heap freelist
MALLOC: + 449403872 ( 428.6 MiB) Bytes in central cache freelist
MALLOC: + 262144 ( 0.2 MiB) Bytes in transfer cache freelist
MALLOC: + 841870984 ( 802.9 MiB) Bytes in thread cache freelists
MALLOC: + 109572256 ( 104.5 MiB) Bytes in malloc metadata
MALLOC: ------------
MALLOC: = 48675164320 (46420.3 MiB) Actual memory used (physical + swap)
MALLOC: + 8663441408 ( 8262.1 MiB) Bytes released to OS (aka unmapped)
MALLOC: ------------
MALLOC: = 57338605728 (54682.4 MiB) Virtual address space used
MALLOC:
MALLOC: 378600 Spans in use
MALLOC: 1451 Thread heaps in use
MALLOC: 8192 Tcmalloc page size
------------------------------------------------
Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
Bytes released to the OS take up virtual address space but no physical memory.

可以看到page heap freelist占了大头。

解释一下,57338605728 (54682.4 MiB) Virtual address space used 是mongo总的使用的虚拟内存。

48675164320 (46420.3 MiB) Actual memory used (physical + swap)是mongo总的使用的实际内存。(我没有开swap)

实际内存又分成两部分,freelist中的和非freelist的。freelist的就是已经分配后来又用完释放的内存,存在这个freelist数据结构中,已备后面重用这些内存,我的理解就是我用完了,但是我先拿着。这样后面的业务来了,mongo就不需要再向os申请分配内存这一步了,从性能和效率的维度来看更好。

但是缺点是内存一直没有还给os,导致os角度来看,内存的使用率很高。

tcmalloc 为性能考虑,每个线程会有自己的 local free page cache,还有 central free page cache;内存申请时,按 local thread free page cache ==> central free page cache 查找可用内存,找不到可用内存时才会从堆上申请;当释放内存时,也会归还到 cache 里,tcmalloc 后台慢慢再归还给 OS操作系统,  多数情况下,内存使用率高的原因是 tcmalloc 未能及时将内存归还给操作系统,导致内存最大可能达到几十GB。mongo为了提高性能,倾向于利用os上尽可能多的内存。

解决

所以可以将freelist的内存及时释放给os,可以解决内存水位过高的问题。

db.adminCommand({setParameter:1,tcmallocAggressiveMemoryDecommit:1})

tcmallocAggressiveMemoryDecommit 是一个服务器参数,用于控制 TCMalloc 内存分配器在什么程度上积极地将不再使用的内存释放回操作系统。当设置为 1(开启状态)时,tcmallocAggressiveMemoryDecommit 会使 TCMalloc 更积极地释放不再使用的内存。这意味着当应用程序释放内存后,TCMalloc 会尝试将这部分内存标记为空闲并返回给操作系统,而不是保留在进程的地址空间中以便快速重用。


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

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

相关文章

【黑马头条】-day04自媒体文章审核-阿里云接口-敏感词分析DFA-图像识别OCR-异步调用MQ

文章目录 day4学习内容自媒体文章自动审核今日内容 1 自媒体文章自动审核1.1 审核流程1.2 内容安全第三方接口1.3 引入阿里云内容安全接口1.3.1 添加依赖1.3.2 导入aliyun模块1.3.3 注入Bean测试 2 app端文章保存接口2.1 表结构说明2.2 分布式id2.2.1 分布式id-技术选型2.2.2 雪…

Unity2018发布安卓报错 Exception: Gradle install not valid

Unity2018发布安卓报错 Exception: Gradle install not valid Exception: Gradle install not valid UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action1[T] progress) (at <c67d1645d7ce4b76823a39080b82c1d1>:0) …

使用Spring Cloud Gateway构建API网关,实现路由、过滤、流量控制等功能。

使用Spring Cloud Gateway构建API网关&#xff0c;实现路由、过滤、流量控制等功能。 使用Spring Cloud Gateway可以轻松地构建API网关&#xff0c;实现路由、过滤、流量控制等功能。下面是一个简单的示例&#xff0c;演示如何在Spring Boot应用程序中集成Spring Cloud Gatewa…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

算法——图论:连通分量数量(深搜,光搜,并查集)

题目&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接…

Ubuntu22.04 部署项目常用知识

文件权限 修改owner sudo chown -R username dirpath #dirpath及其子目录owner都将会变成username sudo find /etc/letsencrypt -type d -exec chmod 750 {} \;#-type d: 限制搜索结果只包含目录&#xff08;directory&#xff09; sudo find /etc/letsencrypt -type f -exec…

MoneyPrinterTurbo搭建详细流程(Linux)及常见问题

先附上链接: MoneyPrinterTurbohttps://github.com/harry0703/MoneyPrinterTurboMoneyPrinterTurbo是一款合成视频的软件。 你只需要提供一个主题或者关键字,就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐,然后合成一个高清的短视频。 接下来讲解详细的搭…

dubbo的服务调用与负载均衡原理、Java如何实现dubbo的服务调用与负载均衡

1、dubbo的服务调用与负载均衡原理 Dubbo是一种分布式服务框架&#xff0c;它支持创建和管理分布式服务&#xff0c;并提供负载均衡的功能。 1、服务调用原理 1.客户端向Dubbo注册中心发起服务调用请求。 2.注册中心根据请求的服务名查找可用的服务提供者列表。 3.注册中心将…

20240328金融读报:国内金融安全网与银行适老化实例

1、国内金融安全网&#xff08;原则&#xff1a;事前防范金融风险过度积累&#xff0c;事中、事后快速高效处置风险&#xff09;&#xff1a;1&#xff09;强化金融机构的公司治理和风险管理&#xff08;如重组与否&#xff09;2&#xff09;二加强金融监管&#xff08;各种存贷…

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统&#xff0c;它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验&#xff0c;同时优化了邮件、Safari浏览器和日历等内置应用程序&#xff0c;使其更加流畅、快速和安全。特别值得一提的是&#xff0c;…

常用目标检测算法集锦

目标检测算法分类 按照算法流程流程可以分为单阶段和两阶段(two-stage)两种。指的是先通过某种方式生成一些备选框,然后对备选框region proposal中内容进行分类,并修正备选框的位置的方法,由于包含了region proposal和detection两个步骤,故称为two-stage。与之不同的是,…

std::vector与std::map的多线程读写问

参考:https://blog.csdn.net/qq_33726635/article/details/117200332 STL 语义上不提供任何强度的线程安全保证。 1、vector与map都不是线程安全的&#xff1a; 同时读 OK 同时写 NO 同时读写 NO 2、vector读写情况&#xff1a; vector一般情况下同时读写读没问题&#xff0…

测试人进阶技能:单元测试报告应用指南

为什么需要单元测试 从产品角度而言&#xff0c;常规的功能测试、系统测试都是站在产品局部或全局功能进行测试&#xff0c;能够很好地与用户的需要相结合&#xff0c;但是缺乏了对产品研发细节&#xff08;特别是代码细节的理解&#xff09;。 从测试人员角度而言&#xff0…

MySQL索引18连问,谁能顶住

前言 过完这个节&#xff0c;就要进入金银季&#xff0c;准备了 18 道 MySQL 索引题&#xff0c;一定用得上。 作者&#xff1a;感谢每一个支持&#xff1a; github 1. 索引是什么 索引是一种数据结构&#xff0c;用来帮助提升查询和检索数据速度。可以理解为一本书的目录&…

关闭Qt在windows上同时生成debug和release目录

qt在windows下编译&#xff0c;例如选择debug模式&#xff0c;但是会在编译目录下生成两个目录&#xff0c;分别是debug和release&#xff0c;生成的exe放在debug目录下。 进行一个简单的测试&#xff0c;读aaa.txt文件&#xff0c;把他放在跟exe同级目录下&#xff0c;测试代码…

1.linux系统根目录的其他目录的含义(18个目录)

①/bin&#xff1a;存放系统的基本可执行命令&#xff08;二进制文件&#xff09;&#xff0c;如ls、cp、mkdir等。 ②/boot&#xff1a;存放引导加载程序和内核相关文件。 ③/dev&#xff1a;存放设备文件&#xff0c;用于与硬件设备进行通信。 ④/etc&#xff1a;存放系统…

6、jenkins项目构建类型-项目类型介绍

文章目录 一、自由风格项目1、拉取代码2、演示改动代码后的持续集成二、Maven项目构建三、Pipeline流水线项目构建(☆☆☆)1、Pipeline简介(1)概念(2)使用Pipeline有以下好处(3)如何创建Jenkins Pipeline呢?2、安装Pipeline插件3、Pipeline语法快速入门(1)Declarati…

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…

Spring boot 发送文本邮件 和 html模板邮件

Spring boot 发送文本邮件 和 html模板邮件 提示&#xff1a;这里使用 spring-boot-starter-mail 发送文本邮件 和 html模板邮件 文章目录 Spring boot 发送文本邮件 和 html模板邮件一、开启QQ邮箱里的POP3/SMTP服务①&#xff1a;开启步骤 二、简单配置①&#xff1a;引入依赖…

8.均值滤波

1 简介 均值滤波是一种低通滤波&#xff0c;它可以有效过滤图片中的椒盐噪声&#xff0c;但是副作用也同样明显&#xff0c;会使图片的边缘过于模糊。   均值滤波的卷积核系数均为1。   这里最终重复一下算法实现以及验证的步骤&#xff1a;     1.MATLAB读取图片并转化…