hi,大家好,有個問題想請教下大家,我們最近將mongodb從2.2.2版本升級到了3.4.6版本,用的是WiredTiger引擎,運行一段時間后,發現幾個不是很能理解的問題。

資料總大小(包括local里的oplog資料20G左右)
但是通過top查看記憶體情況,達到了104G

疑問1:為什么實際使用記憶體比存盤記憶體大那么多?
疑問2:我設定了啟動引數wiredTigerCacheSizeGB=100,但是現在使用記憶體超過了100G,看官網檔案上說,mongodb有兩部分記憶體,一個是WiredTiger internal cache,一個是file system cache,wiredTigerCacheSizeGB引數設定的應該是 internal cache,那整個mongodb的使用記憶體大小能通過引數設定嗎,如果不能設定,那不是無限占用記憶體(官網說MongoDB automatically uses all free memory that is not used by the WiredTiger cache or by other processes)。
uj5u.com熱心網友回復:
你設定了100g,實際使用104g這個應該是正常情況吧畢竟wiredTigerCacheSizeGB只是一部分,并不是它使用的全部記憶體
你可以設定這個值是50g,看看效果,如果只是比50多一點那就說明還是控制住了的
這個記憶體比你的資料量大更加正常,你也可以試著把資料加多一些,加到200g甚至更多,看看它占用記憶體情況
uj5u.com熱心網友回復:
你好,這個104G是inner cache+file system cache,我查了下inner cache有80G,但是這80G包含了哪些資料,熱資料+索引遠遠沒有這個大,如果不包含oplog連10G都不到,為什么會有80G,所以很想知道這80G包含了哪些資料,我現在能想到的兩種可能,1:存在磁盤的資料結構是壓縮的,而存在記憶體當中的是一種沒有壓縮的格式;2:我們每天有個洗掉檔案的操作(洗掉前5天的資料,資料量每天都差不多),是不是檔案洗掉了,記憶體里的沒有洗掉,這種情況在mmap1引擎的時候物理檔案磁盤占用會有這樣的情況,但是感覺wiredtiger引擎應該不會有這樣的問題吧,更何況是記憶體。
uj5u.com熱心網友回復:
你設定了100g,所以mongo就申請了100g,這個沒問題啊,并不是說這100g里一定全是有用的資料你只有一個空庫,mongo也使用100g,你有200g的資料,它還是使用100g,這應該都是正常的
當然,如果設計的好,在確實不需要這么大資料的情況下少用一些也是可以的,這是另外的問題
mongodb吃記憶體很厲害,它設計思路可能就是這樣的,沒考慮過節約記憶體的情況吧
uj5u.com熱心網友回復:
疑問1:為什么實際使用記憶體比存盤記憶體大那么多?-- 存盤的資料是壓縮的
疑問2:我設定了啟動引數wiredTigerCacheSizeGB=100,但是現在使用記憶體超過了100G,看官網檔案上說,mongodb有兩部分記憶體,一個是WiredTiger internal cache,一個是file system cache,wiredTigerCacheSizeGB引數設定的應該是 internal cache,那整個mongodb的使用記憶體大小能通過引數設定嗎,如果不能設定,那不是無限占用記憶體(官網說MongoDB automatically uses all free memory that is not used by the WiredTiger cache or by other processes)。
--mongodb比較貪婪 會盡可能多的使用系統記憶體 直到系統沒有可用記憶體
uj5u.com熱心網友回復:
好像mongodb本身就不太需要手動去設定些什么記憶體相關的東西吧轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/95180.html
標籤:MongoDB
