Mongo資料庫吃記憶體問題以及解決情況
起因
最近一直跑得好好的專案總是會莫名其妙的停了服務,最初的時候沒有在意這個情況,覺得可能只是一個意外而已,可連著發生了好幾次,就覺得有點怪異了,然後檢視tomcat的log檔案,就發現了問題所在了,記憶體不足
當時還覺得有點不理解,應該這臺伺服器的配置還是很高的,然後伺服器上也只是跑了兩個tomcat和一個mongo資料庫,覺得不應該有這種問題的,然後就去查了一下資料,原來是mongo資料庫在作祟,然後自己也用命令去查看了一下
真是不看不知道,一看嚇一跳,一個mongo資料庫佔了伺服器超過一半的記憶體,厲害的時候可以到70多,這時候才知道mongo吃記憶體的嚴重了。
MongoDB如何使用記憶體
目前,MongoDB使用的是記憶體對映儲存引擎,它會把磁碟IO操作轉換成記憶體操作
有時候,即便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
版權宣告:本文為博主原創文章,轉載請附上博文連結!