您好,登錄后才能下訂單哦!
這篇文章主要講解了“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
命令輸出結果例子如下:
{ "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"})
如果你想讓調整在重啟后也有效,那么你需要將配置文件也相應調整一下。
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 } )
一旦做出調整,注意要觀察系統的性能監控確保影響是符合預期的。
感謝各位的閱讀,以上就是“Mongo中MongoDB WiredTiger引擎調優技巧有哪些”的內容了,經過本文的學習后,相信大家對Mongo中MongoDB WiredTiger引擎調優技巧有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。