MongoDB默認使用WiredTiger存儲引擎(推薦),其內存占用主要由cacheSizeGB
參數控制。該參數定義了WiredTiger可使用的最大內存(包括數據緩存和索引緩存)。建議設置為系統可用內存的50%-80%(需預留足夠內存給系統和其他應用),避免過度占用導致內存不足。
操作步驟:
/etc/mongod.conf
):sudo nano /etc/mongod.conf
storage.wiredTiger.engineConfig
section,修改cacheSizeGB
(例如設置為4GB):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根據系統內存調整
sudo systemctl restart mongod
注意:若使用舊版MMAPv1引擎(不推薦),可通過storage.mmapv1.smallFiles=true
減少內存碎片,但性能不如WiredTiger。
低效查詢(如全表掃描)會強制MongoDB加載大量數據到內存,導致內存壓力增大。需通過索引和查詢優化降低內存占用:
_id
、username
、timestamp
)創建索引,避免全表掃描。例如:db.collection.createIndex({ "username": 1 }) // 為username字段創建升序索引
find()
方法的第二個參數指定返回字段,減少內存加載量。例如:db.collection.find({ "status": "active" }, { "name": 1, "email": 1, "_id": 0 }) // 僅返回name和email字段
limit()
方法控制查詢結果數量,避免一次性加載過多數據。例如:db.collection.find().limit(100) // 僅返回前100條記錄
explain()
方法查看查詢執行計劃,確認是否使用了索引。例如:db.collection.find({ "username": "john" }).explain("executionStats")
若winningPlan
中stage
為COLLSCAN
(全表掃描),需優化索引。vm.swappiness
參數(默認60)決定了系統使用Swap空間的傾向。值越高,系統越傾向于將內存數據換出到Swap(會降低性能)。建議將vm.swappiness
設置為0-10(生產環境推薦1),減少Swap對MongoDB的影響:sudo sysctl -w vm.swappiness=1 # 臨時生效
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf # 永久生效
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
可將上述命令添加到/etc/rc.local
中,實現開機自動禁用。通過systemd
可限制MongoDB進程的最大內存使用,避免其占用全部系統內存。
操作步驟:
sudo systemctl edit mongod
[Service]
MemoryLimit=8G
sudo systemctl daemon-reload
sudo systemctl restart mongod
注意:限制值需大于cacheSizeGB
,避免MongoDB因內存不足崩潰。
定期監控MongoDB內存使用情況,識別瓶頸并調整配置:
db.serverStatus().mem
命令查看MongoDB內存使用詳情(包括常駐內存、虛擬內存、緩存命中率等):mongo
> use admin
> db.serverStatus().mem
mongostat
(實時監控命令)、mongotop
(查看集合級讀寫時間)、Prometheus+Grafana
(可視化監控)等工具,持續跟蹤內存、磁盤IO、查詢性能等指標。storage.wiredTiger.collectionConfig.blockCompressor
參數啟用壓縮(如snappy
、zlib
),減少內存和磁盤占用。例如:storage:
wiredTiger:
collectionConfig:
blockCompressor: snappy # 推薦,平衡性能與壓縮比
db.collection.dropIndex()
),釋放內存空間。通過以上策略的綜合應用,可有效解決Linux環境下MongoDB內存不足的問題,提升數據庫性能和系統穩定性。需根據實際業務場景和系統資源,靈活調整配置參數。