文档章节

MongoDB WiredTiger引擎调优技巧

chenkangyao
 chenkangyao
发布于 2017/08/23 08:41
字数 1189
阅读 23
收藏 0
点赞 0
评论 0

MongoDB从3.0开始引入可插拔存储引擎的概念。当前,有不少存储引擎可供选择:MMAPV1、WiredTiger、MongoRocks、TokuSE等等。每个存储引擎都有自己的优势,你需要根据性能要求及应用特征挑选最适合的一个。

从3.2.x开始,WiredTiger成为默认的存储引擎。最为MongoDB目前最流行的存储引擎,WiredTiger与原先的MMAPV1相比有以下优势:

性能&并发:在大多数工作负载下,WiredTiger的性能要比MMAPV1高很多。WiredTiger引擎为现代多核系统量身定制,更好地发挥多核系统的处理能力。MMAPV1引擎使用表级锁,因此,当某个单表上有并发的操作,吞吐将受到限制。WiredTiger使用文档级锁,由此带来并发及吞吐的提高。对于典型的应用,切到WiredTiger引擎,可带来5-10倍的性能提升。

压缩&加密:MMAPV1引擎要求数据在内存和在磁盘的形式一致(map磁盘内存映射)。因此,它并不支持压缩和加密。WiredTiger并没有这层限制,可以更好地支持。

索引前缀压缩:WiredTiger存储索引时使用前缀压缩——相同的前缀只存一次。由此带来的效果是:索引更小了,对物理内存使用也更少了。

接下来,我会展示几个用来调优WiredTiger引擎性能的关键参数。

调优Cache Size

WiredTiger最重要的调优参数就是cache规模。默认,MongoDB从3.x开始会保留可用物理内存的50%(3.2是60%)作为数据cache。虽然,默认的设置可以应对大部分的应用,通过调节为特定应用找到最佳配置值还是非常值得的。cache的规模必须足够大,以便保存应用整个工作集(working set)。

除了这个cache,MongoDB在做诸如聚合、排序、连接管理等操作时需要额外的内存。因此,必须确保有足够的内存可供使用,否则,MongoDB进程有被OOM killer杀死的风险。

调节这个参数,首先要理解在默认配置下,cache的使用情况。运行以下命令,可以获得cache统计:

db.serverStatus().wiredTiger.cache 命令输出结果例子如下:

{ "tracked dirty bytes in the cache" : 409861, "tracked bytes belonging to internal pages in the cache" : 738956332, "bytes currently in the cache" : 25769360777, "tracked bytes belonging to leaf pages in the cache" : 31473298388, "maximum bytes configured" : 32212254720, "tracked bytes belonging to overflow pages in the cache" : 0, "bytes read into cache" : 29628550664, "bytes written from cache" : 34634778285, "pages evicted by application threads" : 0, "checkpoint blocked page eviction" : 102, "unmodified pages evicted" : 333277, "page split during eviction deepened the tree" : 0, "modified pages evicted" : 437117, "pages selected for eviction unable to be evicted" : 44825, "pages evicted because they exceeded the in-memory maximum" : 74, "pages evicted because they had chains of deleted items" : 33725, "failed eviction of pages that exceeded the in-memory maximum" : 1518, "hazard pointer blocked page eviction" : 34814, "internal pages evicted" : 21623, "maximum page size at eviction" : 10486876, "eviction server candidate queue empty when topping up" : 8235, "eviction server candidate queue not empty when topping up" : 3020, "eviction server evicting pages" : 191708, "eviction server populating queue, but not evicting pages" : 2996, "eviction server unable to reach eviction goal" : 0, "pages split during eviction" : 8821, "pages walked for eviction" : 157970002, "eviction worker thread evicting pages" : 563015, "in-memory page splits" : 52, "percentage overhead" : 8, "tracked dirty pages in the cache" : 9, "pages currently held in the cache" : 1499798, "pages read into cache" : 2260232, "pages written from cache" : 3018846 } 第一个要关注的数值试,cache中脏数据的百分比。如果这个百分比比较高,那么调大cache规模很有可能可以提升性能。如果应用是重读的,可再关注bytes read into cache这个指标。如果这个指标比较高,那么调大cache规模很有可能可以提升读性能。

调节cache规模不一定非得重启服务,我们可以动态调整:

db.adminCommand( { "setParameter": 1, "wiredTigerEngineRuntimeConfig": "cache_size=xxG"}) 如果你想让调整在重启后也有效,那么你需要将配置文件也相应调整一下。

控制Read/Write Tickets

WiredTiger使用tickets来控制可以同时被存储引擎处理的读/写操作数。默认值是128,在大部分情况下表现良好。如果这个值经常掉到0,所有后续操作将会被排队等待。例如,观察到读tickets下降,系统可能有大量长耗时的操作(未索引操作)。如果你想找出有哪些慢操作,可以用一些第三方工具。你可以根据系统需要和性能影响上下调节tickets。

运行以下命令可以确认tickets的使用情况:

db.serverStatus().wiredTiger.concurrentTransactions 下面是一个输出例子:

{ "write" : { "out" : 0, "available" : 128, "totalTickets" : 128 }, "read" : { "out" : 3, "available" : 128, "totalTickets" : 128 } } 同样,可以动态调节tickets:

db.adminCommand( { setParameter: 1, wiredTigerConcurrentReadTransactions: xx } ) db.adminCommand( { setParameter: 1, wiredTigerConcurrentWriteTransactions: xx } ) 一旦做出调整,注意要观察系统的性能监控确保影响是符合预期的。

© 著作权归作者所有

共有 人打赏支持
chenkangyao
粉丝 4
博文 29
码字总数 36163
作品 0
广州
高级程序员
MongoDB之compact操作详解

摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。 MongoDB与磁盘 当Fundebug处理的数据越来越多,这导致MongoDB的磁盘使用量越来越多,增长也越来越快。于是,我开始定时删除过期数...

Fundebug ⋅ 04/27 ⋅ 0

MongoDB 无法启动,WiredTiger 如何恢复数据(二)?

之前写过一篇MongoDB 无法启动,如何恢复数据的文章,介绍了几种从无法启动的 MongoDB 节点恢复数据的方法,主要包括: 如果配置了副本集多节点,则从其他节点恢复(强烈建议重要的数据至少要...

张友东 ⋅ 04/30 ⋅ 0

MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入?

MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念。 journal journal 是 MongoDB 存储引擎层的概念,目前 MongoDB主要支...

db匠 ⋅ 05/22 ⋅ 0

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999 ⋅ 05/02 ⋅ 0

mongodb3.2+性能监视

我这是复制集模式,加个认证参数--authenticationDatabase mongostat --port 20012 -uadmin -p='xxxxx' --authenticationDatabase admin 各字段解释说明: insert/s : 官方解释是每秒插入数据...

DB蜗牛 ⋅ 04/27 ⋅ 0

Percona Server for MongoDB 3.4.14-2.12 现已发布

Percona 宣布发布 Percona Server for MongoDB 3.4.14-2.12。Percona Server for MongoDB 是一款增强型,开放源代码且高度可扩展的数据库,它是MongoDB 3.2社区版的完全兼容的替代产品。它支...

周其 ⋅ 04/14 ⋅ 0

WiredTiger 4.1.0 发布,MongoDB 存储引擎

WiredTiger 4.1.0 发布了。WiredTiger 是一个开源的、高性能、可伸缩的 MongoDB 数据存储引擎。 下面是一些性能比较图表: 该版本暂未提供更新内容。 下载地址: Source code (zip) Source c...

达尔文 ⋅ 06/09 ⋅ 0

Centos7下安装mongodb

MongoDB由C++语言编写,是一个基于分布式文件存储的数据库,目的在于为web应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功...

goldfishe ⋅ 05/07 ⋅ 0

MongoDB 4.0 RC 版本强势登陆

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布,本文将介绍 MongoDB 4.0 核心的一些新特性。...

张友东 ⋅ 05/30 ⋅ 0

MongoDB 4.0 首个 RC 版发布,支持多文档事务

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前 4.0 第一个 RC 版本已经发布。 开始体验 MongoDB 4.0 RC:下载地址 ...

局长 ⋅ 06/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

windows profesional 2017 build problem

.net framework .... https://stackoverflow.com/questions/43330915/could-not-load-file-or-assembly-microsoft-build-frameworkvs-2017...

机油战士 ⋅ 43分钟前 ⋅ 0

python3中报错的解决方法(长期更新)

1、ImportError: No module named ‘DjangoUeditor’ 出错原因:安装DjangoUeditor库适用于python2,需要下载适用python3的 下载地址:https://github.com/twz915/DjangoUeditor3 2、python3......

xiaoge2016 ⋅ 48分钟前 ⋅ 0

数据结构与算法之双向链表

一、双向链表 1.双向链表的结点结构 typedef struct DualNode{ ElemType data; struct DualNode *prior; // 前驱结点 struct DualNode *next; // 后继结点}DualNode, *DuL...

aibinxiao ⋅ 今天 ⋅ 0

五大最核心的大数据技术

大数据技术有5个核心部分,数据采集、数据存储、数据清洗、数据挖掘、数据可视化。关于这5个部分,有哪些核心技术?这些技术有哪些潜在价值?看完今天的文章就知道了。 大数据学习群:7165810...

董黎明 ⋅ 今天 ⋅ 0

PhpStorm 头部注释、类注释和函数注释的设置

首先,PhpStorm中文件、类、函数等注释的设置在:setting-》Editor-》FIle and Code Template-》Includes下设置即可,其中方法的默认是这样的: /**${PARAM_DOC}#if (${TYPE_HINT} != "v...

nsns ⋅ 今天 ⋅ 0

spring.net AOP

http://www.springframework.net/doc-latest/reference/html/aop-quickstart.html https://www.cnblogs.com/wujy/archive/2013/04/06/3003120.html...

whoisliang ⋅ 今天 ⋅ 0

【HAVENT原创】创建 Dockerfile 生成新的镜像,并发布到 DockerHub

注意:Win7 与 Win10 的版本存在差异,Win7 版本使用 Docker Quickstart Terminal 进入控制台,Win10下面直接用管理员权限打开控制台或者 PowerShell 即可;另外 Win7 下面只能访问 C盘,/ap...

HAVENT ⋅ 今天 ⋅ 0

pom.xml出现web.xml is missing ...解决方案

提示信息应该能看懂。也就是缺少了web.xml文件,<failOnMissingWebXml>被设置成true了。 搜索了一下,Stack Overflow上的答案解决了问题,分享一下。 目前被顶次数最多的回答原文如下: This...

源哥L ⋅ 今天 ⋅ 0

js时间戳与日期格式之间相互转换

1. 将时间戳转换成日期格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己...

Jack088 ⋅ 今天 ⋅ 0

web添加log4j

添加xml配置log4j.properties # Global logging configuration---root日志设置#log4j.rootLogger=info,dailyRollingFile,stdoutlog4j.rootLogger=debug,stdout,dailyRollingFile---......

黄柳淞 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部