Mongo中MongoDB WiredTiger引擎调优技巧有哪些
这篇文章主要讲解了“Mongo中MongoDB WiredTiger引擎调优技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mongo中MongoDB WiredTiger引擎调优技巧有哪些”吧!
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
引擎性能的关键参数。
WiredTiger
最重要的调优参数就是cache
规模。默认,MongoDB
从3.x
开始会保留可用物理内存的50%(3.2
是60%)作为数据cache
。虽然,默认的设置可以应对大部分的应用,通过调节为特定应用找到最佳配置值还是非常值得的。cache
的规模必须足够大,以便保存应用整个工作集(working set)。
除了这个cache
,MongoDB
在做诸如聚合、排序、连接管理等操作时需要额外的内存。因此,必须确保有足够的内存可供使用,否则,MongoDB
进程有被OOM killer
杀死的风险。
调节这个参数,首先要理解在默认配置下,cache
的使用情况。运行以下命令,可以获得cache
统计:
db.serverStatus().wiredTiger.cache
命令输出结果例子如下:
{"trackeddirtybytesinthecache":409861,"trackedbytesbelongingtointernalpagesinthecache":738956332,"bytescurrentlyinthecache":25769360777,"trackedbytesbelongingtoleafpagesinthecache":31473298388,"maximumbytesconfigured":32212254720,"trackedbytesbelongingtooverflowpagesinthecache":0,"bytesreadintocache":29628550664,"byteswrittenfromcache":34634778285,"pagesevictedbyapplicationthreads":0,"checkpointblockedpageeviction":102,"unmodifiedpagesevicted":333277,"pagesplitduringevictiondeepenedthetree":0,"modifiedpagesevicted":437117,"pagesselectedforevictionunabletobeevicted":44825,"pagesevictedbecausetheyexceededthein-memorymaximum":74,"pagesevictedbecausetheyhadchainsofdeleteditems":33725,"failedevictionofpagesthatexceededthein-memorymaximum":1518,"hazardpointerblockedpageeviction":34814,"internalpagesevicted":21623,"maximumpagesizeateviction":10486876,"evictionservercandidatequeueemptywhentoppingup":8235,"evictionservercandidatequeuenotemptywhentoppingup":3020,"evictionserverevictingpages":191708,"evictionserverpopulatingqueue,butnotevictingpages":2996,"evictionserverunabletoreachevictiongoal":0,"pagessplitduringeviction":8821,"pageswalkedforeviction":157970002,"evictionworkerthreadevictingpages":563015,"in-memorypagesplits":52,"percentageoverhead":8,"trackeddirtypagesinthecache":9,"pagescurrentlyheldinthecache":1499798,"pagesreadintocache":2260232,"pageswrittenfromcache":3018846}
第一个要关注的数值试,cache
中脏数据的百分比。如果这个百分比比较高,那么调大cache
规模很有可能可以提升性能。如果应用是重读的,可再关注bytes read into cache
这个指标。如果这个指标比较高,那么调大cache
规模很有可能可以提升读性能。
调节cache
规模不一定非得重启服务,我们可以动态调整:
db.adminCommand({"setParameter":1,"wiredTigerEngineRuntimeConfig":"cache_size=xxG"})
如果你想让调整在重启后也有效,那么你需要将配置文件也相应调整一下。
控制Read/Write TicketsWiredTiger使用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})
一旦做出调整,注意要观察系统的性能监控确保影响是符合预期的。
感谢各位的阅读,以上就是“Mongo中MongoDB WiredTiger引擎调优技巧有哪些”的内容了,经过本文的学习后,相信大家对Mongo中MongoDB WiredTiger引擎调优技巧有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。