當Debian系統上的MongoDB出現資源占用過高(如內存、CPU、磁盤I/O)時,需從配置優化、索引管理、查詢優化、資源限制、系統調參等多維度入手,以下是具體解決步驟:
MongoDB默認使用WiredTiger存儲引擎,其緩存大?。?code>cacheSizeGB)是影響內存占用的關鍵參數。建議將緩存設置為系統可用內存的50%-75%(避免占用過多內存導致系統或其他進程崩潰)。
修改/etc/mongod.conf配置文件:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根據服務器內存調整(如8GB內存可設為4-6GB)
重啟MongoDB使配置生效:sudo systemctl restart mongod。
user_id、order_id)創建索引,避免全表掃描。例如:db.orders.createIndex({ "user_id": 1, "order_id": 1 }) // 復合索引優化多字段查詢
db.collection.indexes()查看)。db.orders.find({ "user_id": 1 }, { "product": 1 }).hint("user_id_1_order_id_1"))。{ field: 1 })僅返回必要字段,減少內存占用。例如:db.users.find({}, { "name": 1, "email": 1 }) // 不返回敏感或大字段
limit()分頁:避免一次性返回大量數據(如db.orders.find().limit(100))。explain()分析查詢執行計劃,確保查詢使用了索引(executionStats.executionTimeMillis應較低,totalKeysExamined應遠小于totalDocsExamined)。過多的并發連接會占用內存和CPU資源,需控制連接數:
poolSize(建議5-10):mongoose.connect(uri, { poolSize: 10 }); // 限制連接池大小
mongod.conf中設置net.maxIncomingConnections(默認10000,可根據需求調整):net:
maxIncomingConnections: 5000
重啟MongoDB生效。
vm.swappiness=0(禁用Swap,避免內存不足時頻繁換頁):sudo sysctl -w vm.swappiness=0
sudo tee -a /etc/sysctl.conf <<< "vm.swappiness=0" # 永久生效
db.adminCommand({ setParameter: 1, tcmallocAggressiveMemoryDecommit: 1 })
注:此參數可能輕微影響性能,需根據實際情況測試。
通過systemd限制MongoDB的CPU和內存使用(避免占用全部系統資源):
/lib/systemd/system/mongod.service,在[Service]段添加:MemoryLimit=4G # 限制內存為4GB
CPUQuota=80% # 限制CPU使用率為80%
sudo systemctl daemon-reload
sudo systemctl restart mongod
db.sessions.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 }) // 1小時后自動刪除
compact命令回收未使用的存儲空間(需停機執行):mongod --dbpath /var/lib/mongodb --repair # 修復數據庫并壓縮
db.collection.reIndex())。/var/lib/mongodb),提升磁盤IO性能(比HDD快5-10倍)。通過以上步驟,可有效降低Debian系統上MongoDB的資源占用,提升數據庫性能。優化后需持續監控(如使用mongostat、mongotop或第三方工具如Prometheus),根據實際情況調整配置。