Ubuntu下MongoDB內存管理的核心方法
WiredTiger是MongoDB 3.0及以上版本的默認存儲引擎,其緩存機制直接影響內存使用效率。通過修改mongod.conf
配置文件中的storage.wiredTiger.engineConfig.cacheSizeGB
參數,可設置緩存的最大使用量(單位:GB)。建議值為系統可用內存的50%-75%(需預留足夠內存給系統及其他應用,避免內存耗盡導致系統崩潰)。
例如,若服務器有16GB內存,可將緩存設置為8GB(保留8GB給系統):
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
修改后需重啟MongoDB服務使配置生效:
sudo systemctl restart mongod
可通過db.serverStatus().wiredTiger.cache
命令驗證設置,重點關注bytes currently in the cache
(當前緩存數據量)與max bytes configured
(配置的最大緩存)的比例,若前者長期接近后者,說明緩存不足,需適當增加;若前者遠小于后者,說明緩存過大,可適當減小。
合理調整操作系統的內存管理參數,可提升MongoDB的內存使用效率:
swapon -s
查看Swap使用情況,使用fallocate
或dd
命令創建Swap文件(如sudo fallocate -l 2G /swapfile
),并通過chmod 600 /swapfile
、mkswap /swapfile
、swapon /swapfile
啟用。vm.swappiness
設置為10-30(默認值為60),降低Swap使用頻率,提升內存訪問速度:sudo sysctl vm.swappiness=10
sudo tee -a /etc/sysctl.conf <<< "vm.swappiness=10"
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
永久關閉需將上述命令添加到/etc/rc.local
文件中(需賦予執行權限)。定期監控內存使用狀態,是優化內存配置的關鍵依據:
db.serverStatus()
命令:該命令可查看WiredTiger緩存的詳細使用情況(如wiredTiger.cache.bytes dirty in the cache
表示臟數據量,wiredTiger.cache.bytes read into cache
表示讀取的數據量),幫助判斷緩存是否充足。top
/htop
命令:通過top -p $(pgrep mongod)
或htop
查看MongoDB進程的內存占用(RES
表示物理內存占用,VIRT
表示虛擬內存占用),及時發現內存泄漏或過度使用問題。內存管理并非孤立環節,需結合以下手段綜合優化:
projection
)只返回需要的字段(如db.collection.find({}, {name: 1, age: 1})
),避免返回不必要的數據;使用分頁(limit()
+skip()
)限制返回結果數量,減少內存占用。embedding
)或引用(referencing
)優化數據結構,減少關聯查詢(如將用戶的訂單信息嵌入到用戶文檔中,而非單獨建表),降低內存中的數據關聯成本。sharding
)將數據分散到多個服務器,提升內存利用率;通過讀寫分離(readPreference
設置為secondary
),將讀操作分散到從節點,減輕主節點的內存壓力。