MongoDB默認使用WiredTiger存儲引擎(CentOS上推薦配置),其緩存大小由storage.wiredTiger.engineConfig.cacheSizeGB
參數控制。默認情況下,該值為系統物理內存的50%,若服務器有其他應用(如Web服務、中間件),需適當降低此值以避免內存爭搶。
操作步驟:
sudo vi /etc/mongod.conf
;storage.wiredTiger.engineConfig
section,修改cacheSizeGB
(例如設置為2GB):storage:
wiredTiger:
engineConfig:
cacheSizeGB: 2 # 根據服務器內存調整(如8GB內存可設為3-4GB)
sudo systemctl restart mongod
。vm.swappiness
參數vm.swappiness
控制操作系統使用交換空間(Swap)的傾向,默認值為60(較高),會導致MongoDB頻繁將內存數據寫入磁盤,降低性能。建議設置為10以下(甚至0,但需謹慎,避免內存耗盡時無法使用Swap)。
操作步驟:
sudo sysctl vm.swappiness=10
;/etc/sysctl.conf
文件末尾添加vm.swappiness=10
,然后執行sudo sysctl -p
。vm.overcommit_memory
參數vm.overcommit_memory
控制內存分配策略,默認值為0(允許過度分配),可能導致MongoDB申請過多內存而崩潰。建議設置為2(禁止過度分配),避免內存波動。
操作步驟:
/etc/sysctl.conf
文件,添加vm.overcommit_memory=2
;sudo sysctl -p
使配置生效。若MongoDB以systemd
服務運行(CentOS默認方式),可通過systemctl set-property
命令限制其內存使用,防止占用過多系統資源。
操作步驟:
sudo systemctl set-property mongod MemoryLimit=10G
;sudo systemctl restart mongod
。cacheSizeGB
(如cacheSizeGB=2
時,MemoryLimit
可設為3-4倍)。全表掃描(無索引查詢)會加載大量數據到內存,導致內存占用飆升。需為高頻查詢字段(如_id
、user_id
、timestamp
)創建索引,優先使用復合索引(覆蓋查詢字段)。
示例:為orders
集合的user_id
和create_time
字段創建索引:
db.orders.createIndex({ user_id: 1, create_time: -1 });
避免使用$where
、$regex
等低效操作符,盡量使用索引覆蓋查詢(返回字段均在索引中,無需加載數據文件)。
示例:使用投影限制返回字段(僅返回name
和age
):
db.users.find({ age: { $gt: 18 } }, { name: 1, age: 1, _id: 0 });
使用compact
命令回收未使用的存儲空間(需停機執行),減少內存映射文件的大?。?/p>
use admin;
db.runCommand({ compact: 'your_collection_name' });
使用repairDatabase
命令整理數據文件,刪除損壞或無用的數據(需停機執行):
use admin;
db.runCommand({ repairDatabase: 1 });
為臨時數據(如日志、會話)設置過期時間,自動刪除過期文檔,釋放內存:
db.logs.createIndex({ expire_at: 1 }, { expireAfterSeconds: 0 }); // 30天后過期
mongostat
:查看實時操作統計(如讀寫次數、內存使用);mongotop
:查看集合級別的讀寫時間(定位慢查詢)。mongostat --all
(顯示所有集合的操作情況)。top
/htop
:查看MongoDB進程的內存占用(RES
列為核心內存使用);free -h
:查看系統內存使用情況(available
列表示可用內存);vmstat 1
:查看內存、Swap、IO等系統指標(每秒刷新一次)。若服務器內存不足導致系統卡頓,可通過以下命令臨時釋放內存(不會重啟MongoDB,但會導致緩存失效,后續查詢變慢):
sync; echo 3 > /proc/sys/vm/drop_caches
說明:sync
命令將內存中的數據寫入磁盤,echo 3
清除頁緩存、目錄項和inode緩存。
以上方法需根據服務器配置(內存大小、CPU核心數)、業務場景(讀寫比例、數據量)靈活調整。建議先在測試環境驗證效果,再應用到生產環境。