1. 核心內存管理:WiredTiger緩存配置
Debian系統上,MongoDB(3.2及以上版本默認使用WiredTiger存儲引擎)的內存管理核心是調整WiredTiger引擎的緩存大小。緩存大小決定了MongoDB用于緩存數據文件的內存容量,直接影響查詢性能(緩存命中率高則減少磁盤I/O)。
/etc/mongod.conf
(持久化設置)或在啟動時添加命令行參數(臨時調整)。
storage
section下添加wiredTiger.engineConfig.cacheSizeGB
參數,例如設置為系統可用內存的60%(如64GB內存設為38.4GB):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 38.4
--wiredTigerCacheSizeGB
參數指定,例如:mongod --wiredTigerCacheSizeGB 4
2. 操作系統層面優化
為配合MongoDB內存使用,需調整Debian系統的內核參數,減少內存爭用:
vm.swappiness
:該參數控制系統使用Swap的傾向(值越高越易使用Swap)。建議設置為10(范圍0-100),降低Swap使用率,提升性能:echo 10 | sudo tee /proc/sys/vm/swappiness
# 持久化設置(寫入/etc/sysctl.conf)
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
vm.overcommit_memory
:該參數控制內存超額分配策略。設置為1(允許超額分配),避免MongoDB因內存申請失敗而崩潰:echo 1 | sudo tee /proc/sys/vm/overcommit_memory
# 持久化設置
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
vm.dirty_ratio
(臟頁占比閾值,觸發刷新)和vm.dirty_background_ratio
(后臺刷新閾值)控制臟頁刷新頻率,避免大量臟頁堆積導致內存壓力。建議設置為dirty_ratio=20
、dirty_background_ratio=10
。3. 查詢與索引優化
不合理查詢會導致內存占用過高(如全表掃描、未限制返回數據量),需通過以下方式優化:
find
、sort
、aggregate
操作的字段)創建索引,減少全表掃描。例如,為user_id
字段創建單字段索引:db.collection.createIndex({ user_id: 1 })
復合索引(如{ field1: 1, field2: -1 }
)可優化多字段查詢。projection
(投影)限制返回字段(避免返回不必要的字段),使用limit()
限制返回數據量。例如:db.collection.find({}, { name: 1, age: 1 }).limit(100)
explain()
方法查看查詢執行計劃,識別全表掃描或低效操作,針對性優化。4. 連接數管理
過多并發連接會占用內存(每個連接需維護會話狀態),需控制連接數:
maxPoolSize
(最大連接數,建議根據應用并發量調整,如100-500)和maxIdleTimeMS
(連接最大空閑時間,如30000ms),避免過多空閑連接占用內存。5. 內存回收策略
MongoDB支持通過參數調整內存回收行為,快速釋放不再使用的內存:
tcmalloc
(MongoDB默認內存分配器)的aggressiveMemoryDecommit
參數,強制回收未使用的內存。執行以下命令:db.adminCommand({ setParameter: 1, tcmallocAggressiveMemoryDecommit: 1 })
注意:該參數可能增加CPU開銷,僅在內存緊張時啟用。6. 監控與調優
定期監控內存使用情況,評估配置效果:
db.serverStatus().mem
命令查看MongoDB內存使用詳情(包括常駐內存resident
、虛擬內存virtual
、映射內存mapped
等)。mongostat
(實時監控操作統計)、mongotop
(查看集合級讀寫時間)工具,識別內存瓶頸(如高讀取量、慢查詢)。7. 資源限制(可選)
通過Debian的systemd
服務文件限制MongoDB的內存使用(防止內存耗盡導致系統崩潰):
systemd
服務文件(/lib/systemd/system/mongod.service
),添加MemoryLimit
參數(如限制為8GB):[Service]
MemoryLimit=8G
systemd
配置并重啟MongoDB:sudo systemctl daemon-reload
sudo systemctl restart mongod