在最近的一个项目,我们肩负着数十亿记录加载到MongoDB。促使我们挖一点深入WiredTiger旋钮&,这被证明是一个非常有趣的经历。

我们注意到的是负载开始一个体面的速度,但一段时间后开始大幅放缓。做一些研究通过观察指标,我们注意到WiredTiger检查点时间增加随着时间的推移越来越多。我们从只有几分钟甚至几秒钟检查站服用(!)。在检查点,性能基本上加:

WiredTiger MongoDB检查点

理解WiredTiger检查点

MongoDB 4.2, WiredTiger引擎做一个完整的检查点每隔60秒(所控制检查点=(等待= 60))。这意味着所有脏页WiredTiger缓存中必须每60秒刷新到磁盘。记住WiredTiger缓存的默认值是50%的可用内存,所以我们必须限制脏页的数量或遭受(后面详细讨论)。

瓦迪姆的文章中提到检查点反击战,完整的检查点可以导致一些“的”的性能。有一些方法可以减轻影响,正如我们将看到的,但不是完全消除它。

顺便说一句,您可能想知道为什么默认WiredTiger缓存值只有50%的可用内存,而不是像80 - 90%。原因是MongoDB利用操作系统的缓冲。WiredTiger缓存内,只未压缩的页面保存,而操作系统的缓存(压缩)页面写入到数据库文件。留下足够的空闲内存的操作系统,我们增加的机会从操作系统获取页面的缓冲区,而不是做一个磁盘读取页面错误。

被驱逐的过程

驱逐主要是删除从WiredTiger最近最少使用页面缓存,为哪个房间需要访问其他页面。在大多数数据库,有专门的后台线程来执行这项工作。让我们看看可用的参数优化。

控制WiredTiger缓存大小

这些参数表示为一个百分比的总WiredTiger缓存和控制整个缓存使用。使用数量意味着清洁+脏页的总和。让我们看一个例子:

考虑一个服务器200 Gb的RAM和WiredTiger缓存设置为100 Gb。驱逐线程将尽量保持内存使用量在80 Gb (eviction_target)。如果压力太高,和缓存的使用增加高达95 Gb (eviction_trigger),然后应用程序/线程的客户将被扼杀了。如何?他们将被要求帮助后台线程执行驱逐之前被允许去做他们的工作,帮助减轻一些压力,以牺牲客户增加延迟。即使这是不够的,配置的缓存大小的缓存达到100%,操作将停滞不前。

限制脏页的数量

这双参数控制的脏缓存中的内容。基本上,驱逐线程将参与当脏页的数量占总数的5%或更多缓存大小。我们让这数量增长到20%之前调用应用程序线程再次求助,为客户增加延迟(与之前相同的“诡计”)。

记住,在大幅或完整的检查点,所有脏页刷新到磁盘。这将使用你所有的磁盘写只要需要的能力。这也解释了为什么这些值“低”违约,我们想限制数据库的工作量在每个检查点。

这些参数,表示为一个百分比的总WiredTiger缓存使用。我们可以最低是1%(不允许有浮点值)。1%仍然可以很多服务器上高的记忆!256克的缓存并不少见,和1%的2.56 Gb。刷新一次,每分钟一次。

这可能是过多的磁盘,取决于你有什么样的硬件处理。进一步减少,唯一的方法就是减少WiredTiger缓存的大小,其他后果。这将是很高兴可以选择来表达eviction_dirty_target数MB。

上浆驱逐线程

默认情况下,MongoDB分配四个后台线程执行驱逐。我们可以选择指定最小值和最大值,然而,它不是很清楚有效的线程数量决定(我想我需要去深入研究源代码)。此外,线程的最大数量是硬编码到20因为某些原因。

对于这个特殊的情况下,默认4个线程没有足够跟上脏页面生成的速度,就是明证raybetapp官方下载 (PMM)图形:

MongoDB驱逐

所以最小化摊位,我们需要做的就是控制脏页面的数量,这样时间一个检查点是“合理的”(比方说在< 10年代范围)。记住更多的线程意味着更多的IO带宽和更多的CPU资源(由于压缩)。

驱逐调优

做一些与可用的硬件实验后,我们决定驱逐线程的数量增加到最大20,减少脏阈值范围的百分之五,同时设置一个小WiredTiger缓存的1 Gb,这将限制脏页的数量为10 - 50 Mb。

改变设置,我们可以运行以下命令:

注意客户机线程阻塞,而这个命令完成。根据我的经验,这通常只是几秒钟,但我看过情况下非常繁忙的服务器上,它可能需要几分钟。为了安全起见,计划部署此维护窗口。

如果我们想要持久的设置,一种选择是编辑systemd单元文件(/usr/lib/systemd/system/mongod.serviceRH / Centos)和通过wiredTigerEngineConfigString论点下面的例子:

这是如何照顾:

WiredTiger缓存页面

最后的话

我希望这篇文章阐明一些WiredTiger内工作机制,帮助你更好的配置MongoDB。

即使默认设置工作对于大多数用例,您可能必须调整如果写得到高的东西。我的印象是不有许多参数可以在这一次,和文档内部还有很大的改进余地。

看着WiredTiger MongoDB的当前状态,这让我想起很多MySQL的挑战时首先将InnoDB存储引擎。我认为值得重新审视决定使用锋利的检查点。

观察指标是关键要了解发生了什么,并跟踪参数的变化的影响。我强烈建议你部署一个趋势的工具raybetapp官方下载 如果你不已经有一个了。

8评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
Gowtham Raj Elangovan

如果我们减少wiredTiger缓存,未来不会查询从磁盘读取更频繁?这是交易吗?

凯Agahd

伊凡感谢伟大的帐面价值的!一个问题:大部分进口花了多长时间与mongodb的默认设置和与您的设置需要多长时间?

凯文·伍德

哇!伟大的文章。谢谢你的分享。

sreesateesh kodali

好文章伊凡。感谢分享

安德烈Piwoni

我认为降低阈值从eviction_dirty_trigger = 20, eviction_dirty_target eviction_dirty_trigger = 5 = 5, eviction_dirty_target = 1只适用工作线程是否真的能够跟上。降低阈值应用程序线程从20到5只适用如果与负载能够确保你保持大多低于20。配置负载不幸的是没有很大的帮助。