首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MONGODB 性能与调优 -- 内存调优 2 (怎么计算驱逐率与调整参数)

MONGODB 性能与调优 -- 内存调优 2 (怎么计算驱逐率与调整参数)

作者头像
AustinDatabases
发布于 2022-05-19 00:53:13
发布于 2022-05-19 00:53:13
1.3K00
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

接上次文,当MONGODB 在操作时脏的数据块达到一定程度的情况下,就需要将这些数据转移到磁盘中,我们可以称之为驱逐。驱逐实际上是一个正常的操作,但是如果是一个大的驱逐的操作,换而言之,当你要推入磁盘的数据太大的时候,就会产生一个叫拥塞的东西,也就是你产生的“食物”,无法一次性快速的赛道嘴里,然后还要强塞,那你就噎着了。

解决这个问题的方法很多,

1 你拥有更强大的带宽的磁盘设备,也就是你有一张大嘴。

2 进来不要让你产生的食物涨大道可以噎死你的地步。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var wtt=db.serverStatus().wiredTiger
var blockingEvictRate=wtt['thread-yield']['page acquire eviction blocked']*100 / wtt['cache']['eviction server evicting pages']

上面的公式主要的含义为,我从我驱逐的页面再次获得我要的信息,与我从内存中驱逐的页面之比

通过上面的方式来计算你的数据的页面的驱逐率,当你发现你的MONGODB BLOCKED 驱逐率逐步走高的情况下。除了上面的你可以从硬件方面可以做的。

还可以试一下,通过调整参数的方式来让你的MONGODB 的支持更快的刷新速度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.adminCommand({
... ... setParameter: 1,
... ... wiredTigerEngineRuntimeConfig:
... ... `eviction=(threads_min=4,threads_max=4),
... ... eviction_dirty_trigger=5,eviction_dirty_target=1,
... ... eviction_trigger=95,eviction_target=80`
... ... });

上面的调整为,对wiredTiger引擎的配置进行更改,其中将驱逐的线程进行固化 4个, 并且触发脏页刷新的触发机制提前,这就类似于提高数据库的checkpoint 的频率。可以解决一部分的问题,但如果你的硬件真的不怎么样,这样做也是徒劳。

其实徒劳的原因和下一个我们说的操作 CHECKPOINT 有关, 大量的数据写入到内存中,必须要找时间释放到磁盘上,将脏页刷新到磁盘,默认的刷新时间为60秒,

那么一个不好的checkpoint 会产生什么影响

1 大量的数据瞬间写入到磁盘,会影响当时时刻的整体的数据库的性能,可能会导致短暂的语句的处理的缓慢的情况 。

那么如果磁盘出现锯齿装的I/O 那么就值得来看看我们的问题了

这里有两个参数我们上面使用过了

eviction_dirty_trigger

eviction_dirty_target_settings

这里会牵扯几个问题,1 多少信息保留在cache中 2 什么情况下会触发将内存的数据刷到我们的磁盘上,减少这些参数的情况下,可以提高刷新脏页的频度。

eviction.threads_min

eviction.threads_max

这两个是针对多少线程来进行对CHECKPOINT 的操作,这个设置与我们的CPU 的核心数和繁忙度有关。

checkpoint的时间设置可以调整, 减少时间可以增加数据的刷新率,但是如果间隔过短,但是数据量过大,会造成磁盘的压力,导致系统卡顿。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.adminCommand({
setParameter: 1,
wiredTigerEngineRuntimeConfig:
`eviction=(threads_min=10,threads_max=10),
checkpoint=(wait=500),
eviction_dirty_trigger=5,
eviction_dirty_target=1`
});

所以当你发现的你的系统的性能在每个一分钟发生性能的抖动,那么很幸运也不幸运,你发现了问题,但解决是一个难题。

通过下面的命令可以去查看当前MONGODB 的配置文件信息

db._adminCommand( {getCmdLineOpts: 1})

下面是查看你刚刚配置的MOGNODB 的配置信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.adminCommand({getParameter: 1, wiredTigerEngineRuntimeConfig: 1})

与内存有关的性能问题还有一个地方就是我们的读写中的concurrency, 我们通过 db.serverStatus().wiredTiger.concurrentTransactions 来查看当前的系统中的状态是如何的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.adminCommand({setParameter: 1, wiredTigerConcurrentWriteTransactions: '256'})

为什么要动这个值,实际上对于MONGODB 频繁写入的情况下,通过Mongostat 来查看系统的性能的情况下,qw会持续的走高,这说明写入在进行排队的操作,WiredTiger无法满足数据插入的情况,此时如果CPU 负载不高情况下,可以调整上面的参数看看是否有改善,但带来的问题就是内存会使用率上升,另外不建议扩展的过高,太高对于CPU的负载压力过大。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈缓存写法(一):缓存的雪崩和穿透
为了方便演示,这里使用Runtime.Cache做缓存容器,并定义个简单操作类。如下:
Java_老男孩
2019/06/28
4240
python之crawlspider初探
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">""" 1、用命令创建一个crawlspider的模板:scrapy genspider -t crawl <爬虫名> <all_domain>,也可以手动创建 2、CrawlSpider中不能再有以parse为名字的数据提取方法,这个方法被CrawlSpider用来实现基础url提取等功能 3、一个Rule对象接受很多参数,首先第一个是包含url规则的LinkExtractor对象, 常有的还有callback(制定满足规则的解析函数的字符串)和follow(response中提取的链接是否需要跟进) 4、不指定callback函数的请求下,如果follow为True,满足rule的url还会继续被请求 5、如果多个Rule都满足某一个url,会从rules中选择第一个满足的进行操作 """</pre>
用户5760343
2019/08/02
5200
python之crawlspider初探
python metaclass ..
关于Python2.x中metaclass这一黑科技,我原以为我是懂的,只有当被打脸的时候,我才认识到自己too young too simple sometimes native。
用户5760343
2019/12/13
6240
python metaclass ..
python swig封装c/c++成Python库
//------------------------------------------------------------------------
用户5760343
2022/05/14
6220
Docker 日志切割参考
===============================================
用户5760343
2019/11/05
2K0
Docker 日志切割参考
Spring源码阅读-IOC 容器解析
在Spring框架中最重要的是Spring IoC容器,它是Spring框架的核心。本文将从更高的角度来解析Sping IoC容器,了解其是如何设计的。了解一样东西最好的办法是从其核心本质出发,只要把握住了这样一个核心,其他的一些东西也迎刃而解了。这是一个很好的开端,我们一起开始吧...
美的让人心动
2019/07/28
4090
浅谈分布式计算的开发与实现(二)
接上篇,离线计算是对已经入库的数据进行计算,在查询时对批量数据进行检索、磁盘读取展示。 而实时计算是在数据产生时就对其进行计算,然后实时展示结果,一般是秒级。 举个例子来说,如果有个大型网站,要实时统计用户的搜索内容,这样就能计算出热点新闻及突发事件了。 按照以前离线计算的做法是不能满足的,需要使用到实时计算。
Java_老男孩
2019/07/02
4730
浅谈分布式计算的开发与实现(二)
python asyncio异步http(并行编程 30)
前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病。然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最新的微服务框架japronto,resquests per second可达百万级。
用户5760343
2019/07/30
1.2K0
python asyncio异步http(并行编程 30)
dstat用法
监控CPU\MEN: dstat --top-mem --top-io --top-cpu 常用常规监控:dstat -cmsdnl -D sda1 -N lo,ens33 100 5
用户5760343
2022/05/23
5460
dstat用法
flask flask-login使用笔记(flask 55)
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">pip install flask_login</pre>
用户5760343
2019/08/15
1.5K0
flask flask-login使用笔记(flask 55)
[C++]C风格、C++风格和C++11特性的线程池
thread pool就是线程的一种使用模式,一个线程池中维护着多个线程等待接收管理者分配的可并发执行的任务。
TOMOCAT
2022/04/01
5820
[C++]C风格、C++风格和C++11特性的线程池
Mybats生命周期&缓存-------(引用)
在这里主要记录系统缓存的一些简单概念, 并没有涉及原理。其中会涉及Mybatis的相关配置以及生命周期等。 主要参考资料:《深入浅出Mybatis基础原理与实战》,http://www.mybatis.org/mybatis-3/zh/index.html
名字是乱打的
2022/05/13
3010
Mybats生命周期&缓存-------(引用)
MyBatis Generator 用法详解 XML配置详解 3. <generatorConfiguration>的子元素MyBatis Generator中文文档
MBG全部指代MyBatis Generator MyBatis Generator 1.3.4 扩展,可以设置 Mapper(Dao)后缀 运行MyBatis Generator 有4种运行MBG的方法,具体请看文档 运行 MyBatis Generator MBG下载地址: http://repo1.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/ XML配置详解 在MBG中,最主要也最重要的就是XML配置文件,因
JavaEdge
2018/05/16
2K0
2018-09-11 Svn升级Git不需要那么痛URL that points to a project root(may be the same as Subversion repository
一. 介绍 SubGit是用java语言编写的。SubGit是一种subversion与git代码库之间双向同步工具。如何在本地subversion版本库上安装SubGit请参考下片文章。本片文章主要说明使用SubGit创建git镜像远程subversion版本库。
Albert陈凯
2018/09/20
1K0
2018-09-11 Svn升级Git不需要那么痛URL that points to a project root(may be the same as Subversion repository
bootstrap 自动补全插件Bootstrap Typeahead 组件
Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便。这里我们将介绍一下这个组件的使用。
用户5760343
2019/10/14
3.2K0
bootstrap 自动补全插件Bootstrap Typeahead 组件
Android面试高级:内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和View的
主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。
zhangjiqun
2024/12/16
2020
Linux logrotate 详细
志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。
用户5760343
2019/10/30
7980
Linux logrotate 详细
用10行Python代码,实现AI目标检测技术!(Python是最好的语言)
今天为大家带来的内容是,用10行Python代码,实现AI目标检测技术!(Python是最好的语言),本文具有不错的参考意义,希望能够帮助到你!
用户6133654
2019/10/10
7940
用10行Python代码,实现AI目标检测技术!(Python是最好的语言)
看阿里大牛深入浅出Java 线程池原理分析与使用
在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。 使用线程池的好处 1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控 线程池的工作原理 首先我们看下当一个新的任务提交到线程池之后,线程池是如何
Java架构
2018/07/06
3720
Zookeeper 安装
ZooKeeper服务器是用Java创建的,它在JVM上运行。你需要使用JDK 6或更高版本。
用户5760343
2019/10/25
5980
推荐阅读
相关推荐
浅谈缓存写法(一):缓存的雪崩和穿透
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验