Ubuntu環境下,MongoDB(3.2及以上版本)默認采用WiredTiger作為存儲引擎,其內存管理的核心是可配置的緩存池。通過storage.wiredTiger.engineConfig.cacheSizeGB參數設置緩存上限,建議值為系統總內存的50%-70%(需預留足夠內存給操作系統及其他進程)。例如,8GB內存的服務器可將cacheSizeGB設為4-5GB,避免內存過度占用導致系統卡頓。
WiredTiger采用LRU(最近最少使用)算法自動淘汰不常用數據,當緩存使用量接近上限時,會將部分冷數據移出內存,為熱點數據騰出空間。此外,還支持通過evictionTarget(默認80%,即緩存使用量達到80%時開始淘汰)、evictionThreshold(默認95%,超過則請求線程會參與淘汰)等參數調整淘汰策略,平衡性能與延遲。
盡管WiredTiger能有效利用內存,但仍需合理配置操作系統內存機制,防止內存耗盡導致進程崩潰。
vm.swappiness(默認值60)調整系統使用Swap的傾向,取值范圍0-100。建議設置為10以下(如sudo sysctl vm.swappiness=10),減少Swap使用頻率,避免頻繁磁盤IO影響MongoDB性能。定期監控內存使用情況是優化的前提,可通過以下工具和方法實現:
db.serverStatus().mem命令:查看MongoDB實例的內存詳情,包括常駐內存(resident)(實際使用的物理內存)、虛擬內存(virtual)(進程占用的虛擬地址空間)、映射數據大?。╩apped)(映射到內存的文件大?。┑戎笜?。top、htop或free -h命令查看MongoDB進程的內存占用情況,重點關注RES(常駐內存)列。除上述核心策略外,還可通過以下方式間接優化內存使用:
projection(投影)僅返回必要字段,減少數據傳輸量;用limit()限制返回結果數量,避免一次性加載大量數據到內存。net.ipv4.tcp_wmem(寫緩沖區)、net.ipv4.tcp_rmem(讀緩沖區)等系統參數,優化TCP連接的內存使用,避免因連接過多導致內存耗盡。以上策略需結合服務器硬件配置(內存、磁盤類型)、應用場景(讀寫比例、數據量)及業務需求動態調整,建議在測試環境中驗證后再應用于生產環境。