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

2021-08-07 13:38:48 字數 1352 閱讀 6870

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

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

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

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

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

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

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

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

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

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

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

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

僅以該文讓自己以後再遇該類問題可以有據可依,也讓他人不再困惑於這個問題上



mongo資料庫備份還原

備份 命令介紹 mongodump h dbhost d dbname o dbdirectory d 需要備份的資料庫例項,例如 test o 備份的資料存放位置,例如 c data dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立乙個test目錄,這個目錄裡面存放該資...

PHP操作mongo資料庫

conn new mongoclient mongodb localhost 27017 mongodb username password host port db conn chili 選擇資料庫 col db test 選擇集合 dbs conn listdbs 檢視所有的表 collecti...

Mongo資料庫操作(三)

開通黃鑽 建立資料庫 use 如何什麼都不幹的話 會被刪除 檢視所有的資料 show dbs 給指定資料庫中新增資料 db.persons.insert 查詢資料庫中所有文件 show collections 查詢指定文件的資料 db.documentname find 查詢第一條資料 db.doc...