mongodb佔用內存過大

主機4核8G內存

1、情景:
    當天運營讓統計最近3個月消耗數量,
    3個每月聚合統計,每月數據大約在1千萬,表最大1.5億條,
同時有查詢插入,每秒查詢20,插入10
此時內存降低1G,報警

2、嘗試解決
查詢完畢後,內存沒釋放,報警沒停止

嘗試釋放內存命令  db.runCommand({closeAllDatabases:1}),但是3.2以後不能用,目前線上3.4.0

測試環境嘗試停止,啓動命令,合計耗時預計20秒。

運維不同意重啓,嘗試其他方法

開始刪除少量不用的數據嘗試,內存、磁盤沒降低
開始刪除大量去年的大表記錄數據8千萬嘗試,內存增加了300M,磁盤沒降低

運維不同意重啓,嘗試其他方法

db.repairDatabase() 內存突然增加2G,鎖,報錯,會鎖庫導致無法訪問,即便重啓也不會停止,當時我用了14分鐘纔可以繼續使用,會重建索引。

線上開始斷開連接,報錯

找運維重啓mongodb,重啓後內存佔用1G

從線上停用到啓用,預計耗時3分鐘

3、事後分析

a、簡單處理
mongodb重啓,預計8個月左右需要重啓一次

b、停機維護
預計一年一次,compact、repairDatabase也可以 可以通過mongodump將指定database的所有數據導出,然後將原有的db刪除,再通過mongorestore指令將數據重新導入

c、修改mongodb內存參數
https://docs.mongodb.com/manual/core/wiredtiger/index.html

mongodb 參數設置
storage.wiredTiger.collectionConfig.blockCompressor 壓縮,新表壓縮,舊錶不變 New in version 3.0.0.,默認值即可
storage.wiredTiger.indexConfig.prefixCompression 索引壓縮,默認值即可

hostInfo.system.memLimitMB 最大內存設置,vesion  4.0.9 (and 3.6.13)

storage.wiredTiger.engineConfig.cacheSizeGB 設置緩存大小,默認最大能到3.8G,可用配置,從verison 3.4開始可用
maxIndexBuildMemoryUsageMegabytes 單個數據庫索引佔用內存,默認值即可 New in version 3.4,Default: 500

網上介紹使用最多的是storage.wiredTiger.engineConfig.cacheSizeGB  或者參數 --wiredTigerCacheSizeGB ,需要重啓mongodb

4、

官網定義: repairDatabase確認並修復數據存儲中的錯誤和不一致的地方,類似於linux下的文件操作命令fsck 。當數據庫被意外重啓或破壞時,使用repairDatabase命令來確保數據完整。

實際操作:壓縮數據庫中所有的collections,等同於分別在每個collection上進行compact命令。減少了磁盤中數據文件的總大小,並且重建了數據庫中的所有索引。

安全性:當使用repairDatabase 命令或者在shell命令中運行db.repairDatabase() 或者mongod –repair的過程中,清除的破損文件將不可恢復。Repair過程中,其他所有操作都無法執行,直到修復完成。

https://blog.csdn.net/Ginny_2017/article/details/88886262

5、mongodb compact

remove 會產生邏輯的空閒空間,這些空間能立即用於寫入新數據,但文件佔用的總物理空間不會立即回收;通常只要持續在寫入數據,有物理空間碎片問題並不大,不需要去 compact 集合,有的場景,remove 了大量的數據後,後續的寫入可能並不多,這時如果想回收空間,就需要顯式的調用 compact。

compact 命令對讀寫的影響

compact 一個集合,會加集合所在DB的互斥寫鎖,會導致該DB上所有的讀寫請求都阻塞;因爲 compact 執行的時間可能很長,跟集合的數據量相關,所以強烈建議在業務低峯期執行,避免影響業務。

http://www.mongoing.com/archives/26907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章