溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mongo中MongoDB WiredTiger引擎調(diào)優(yōu)技巧有哪些

發(fā)布時間:2021-11-11 13:51:53 來源:億速云 閱讀:313 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要講解了“Mongo中MongoDB WiredTiger引擎調(diào)優(yōu)技巧有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Mongo中MongoDB WiredTiger引擎調(diào)優(yōu)技巧有哪些”吧!

MongoDB3.0開始引入可插拔存儲引擎的概念。當(dāng)前,有不少存儲引擎可供選擇:MMAPV1、WiredTigerMongoRocks、TokuSE等等。每個存儲引擎都有自己的優(yōu)勢,你需要根據(jù)性能要求及應(yīng)用特征挑選最適合的一個。

3.2.x開始,WiredTiger成為默認(rèn)的存儲引擎。最為MongoDB目前最流行的存儲引擎,WiredTiger與原先的MMAPV1相比有以下優(yōu)勢:

  • 性能&并發(fā):在大多數(shù)工作負(fù)載下,WiredTiger的性能要比MMAPV1高很多。WiredTiger引擎為現(xiàn)代多核系統(tǒng)量身定制,更好地發(fā)揮多核系統(tǒng)的處理能力。MMAPV1引擎使用表級鎖,因此,當(dāng)某個單表上有并發(fā)的操作,吞吐將受到限制。WiredTiger使用文檔級鎖,由此帶來并發(fā)及吞吐的提高。對于典型的應(yīng)用,切到WiredTiger引擎,可帶來5-10倍的性能提升。

  • 壓縮&加密MMAPV1引擎要求數(shù)據(jù)在內(nèi)存和在磁盤的形式一致(map磁盤內(nèi)存映射)。因此,它并不支持壓縮和加密。WiredTiger并沒有這層限制,可以更好地支持。

  • 索引前綴壓縮WiredTiger存儲索引時使用前綴壓縮——相同的前綴只存一次。由此帶來的效果是:索引更小了,對物理內(nèi)存使用也更少了。

接下來,我會展示幾個用來調(diào)優(yōu)WiredTiger引擎性能的關(guān)鍵參數(shù)。

調(diào)優(yōu)Cache Size

WiredTiger最重要的調(diào)優(yōu)參數(shù)就是cache規(guī)模。默認(rèn),MongoDB3.x開始會保留可用物理內(nèi)存的50%(3.2是60%)作為數(shù)據(jù)cache。雖然,默認(rèn)的設(shè)置可以應(yīng)對大部分的應(yīng)用,通過調(diào)節(jié)為特定應(yīng)用找到最佳配置值還是非常值得的。cache的規(guī)模必須足夠大,以便保存應(yīng)用整個工作集(working set)。

除了這個cache,MongoDB在做諸如聚合、排序、連接管理等操作時需要額外的內(nèi)存。因此,必須確保有足夠的內(nèi)存可供使用,否則,MongoDB進(jìn)程有被OOM killer殺死的風(fēng)險。

調(diào)節(jié)這個參數(shù),首先要理解在默認(rèn)配置下,cache的使用情況。運(yùn)行以下命令,可以獲得cache統(tǒng)計:

db.serverStatus().wiredTiger.cache

命令輸出結(jié)果例子如下:

{   "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}

第一個要關(guān)注的數(shù)值試,cache中臟數(shù)據(jù)的百分比。如果這個百分比比較高,那么調(diào)大cache規(guī)模很有可能可以提升性能。如果應(yīng)用是重讀的,可再關(guān)注bytes read into cache這個指標(biāo)。如果這個指標(biāo)比較高,那么調(diào)大cache規(guī)模很有可能可以提升讀性能。

調(diào)節(jié)cache規(guī)模不一定非得重啟服務(wù),我們可以動態(tài)調(diào)整:

db.adminCommand( { "setParameter": 1, "wiredTigerEngineRuntimeConfig": "cache_size=xxG"})

如果你想讓調(diào)整在重啟后也有效,那么你需要將配置文件也相應(yīng)調(diào)整一下。

控制Read/Write Tickets

WiredTiger使用tickets來控制可以同時被存儲引擎處理的讀/寫操作數(shù)。默認(rèn)值是128,在大部分情況下表現(xiàn)良好。如果這個值經(jīng)常掉到0,所有后續(xù)操作將會被排隊等待。例如,觀察到讀tickets下降,系統(tǒng)可能有大量長耗時的操作(未索引操作)。如果你想找出有哪些慢操作,可以用一些第三方工具。你可以根據(jù)系統(tǒng)需要和性能影響上下調(diào)節(jié)tickets。

運(yùn)行以下命令可以確認(rèn)tickets的使用情況:

db.serverStatus().wiredTiger.concurrentTransactions

下面是一個輸出例子:

{   "write" : {      "out" : 0,      "available" : 128,      "totalTickets" : 128
   },   "read" : {      "out" : 3,      "available" : 128,      "totalTickets" : 128
   }
}

同樣,可以動態(tài)調(diào)節(jié)tickets

db.adminCommand( { setParameter: 1, wiredTigerConcurrentReadTransactions: xx } )db.adminCommand( { setParameter: 1, wiredTigerConcurrentWriteTransactions: xx } )

一旦做出調(diào)整,注意要觀察系統(tǒng)的性能監(jiān)控確保影響是符合預(yù)期的。

感謝各位的閱讀,以上就是“Mongo中MongoDB WiredTiger引擎調(diào)優(yōu)技巧有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Mongo中MongoDB WiredTiger引擎調(diào)優(yōu)技巧有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI