1. 程式人生 > >Mongo資料庫吃記憶體問題以及解決情況

Mongo資料庫吃記憶體問題以及解決情況

起因
最近一直跑得好好的專案總是會莫名其妙的停了服務,最初的時候沒有在意這個情況,覺得可能只是一個意外而已,可連著發生了好幾次,就覺得有點怪異了,然後檢視tomcat的log檔案,就發現了問題所在了,記憶體不足


當時還覺得有點不理解,應該這臺伺服器的配置還是很高的,然後伺服器上也只是跑了兩個tomcat和一個mongo資料庫,覺得不應該有這種問題的,然後就去查了一下資料,原來是mongo資料庫在作祟,然後自己也用命令去查看了一下

真是不看不知道,一看嚇一跳,一個mongo資料庫佔了伺服器超過一半的記憶體,厲害的時候可以到70多,這時候才知道mongo吃記憶體的嚴重了。

MongoDB如何使用記憶體
        目前,MongoDB使用的是記憶體對映儲存引擎,它會把磁碟IO操作轉換成記憶體操作

,如果是讀操作,記憶體中的資料起到快取的作用,如果是寫操作,記憶體還可以把隨機的寫操作轉換成順序的寫操作,總之可以大幅度提升效能。MongoDB並不干涉記憶體管理工作,而是把這些工作留給作業系統的虛擬快取管理器去處理,這樣的好處是簡化了MongoDB的工作,但壞處是你沒有方法很方便的控制MongoDB佔多大記憶體,事實上MongoDB會佔用所有能用的記憶體,所以最好不要把別的服務和MongoDB放一起。

有時候,即便MongoDB使用的是64位作業系統,也可能會遭遇臭名昭著的OOM問題,出現這種情況,多半是因為限制了虛擬記憶體的大小所致,可以這樣檢視當前值:

大部分人都會和我一樣,那就很好,如果不是的,可以自己修改過來:

不過要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的啟動指令碼下。

       有時候,出於某些原因,你可能想釋放掉MongoDB佔用的記憶體,不過前面說了,記憶體管理工作是由虛擬記憶體管理器控制的,所以通常你只能通過重啟服務來釋放記憶體,你一定不齒於這樣的方法,幸好可以使用MongoDB內建的closeAllDatabases命令達到目的:

當然,通過調整核心引數drop_caches也是可以釋放快取的

平時可以通過mongo命令列來監控MongoDB的記憶體使用情況,如下所示:

還可以通過mongostat命令來監控MongoDB的記憶體使用情況,如下所示:

其中記憶體相關欄位的含義是:

mapped:對映到記憶體的資料大小 

僅以該文讓自己以後再遇該類問題可以有據可依,也讓他人不再困惑於這個問題上(不過這個方法只能當時讓mongodb的佔用記憶體降下來,過一段時間佔用記憶體的大小還是會上去);

所以建議mongodb建叢集。
--------------------- 
作者:top_gun_1 
來源:CSDN 
原文:https://blog.csdn.net/top_gun_1/article/details/50777329?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!