溫馨提示×

centos上mongodb內存占用高怎么辦

小樊
35
2025-10-06 23:27:37
欄目: 云計算

1. 調整WiredTiger存儲引擎緩存大小

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)
    
  • 重啟MongoDB服務使配置生效:sudo systemctl restart mongod。

2. 優化操作系統內存參數

調整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使配置生效。

3. 使用systemd限制MongoDB內存

若MongoDB以systemd服務運行(CentOS默認方式),可通過systemctl set-property命令限制其內存使用,防止占用過多系統資源。
操作步驟

  • 限制內存為10GB(包含緩存和堆內存):sudo systemctl set-property mongod MemoryLimit=10G;
  • 重啟MongoDB服務使限制生效:sudo systemctl restart mongod。
    注意:限制值需大于cacheSizeGB(如cacheSizeGB=2時,MemoryLimit可設為3-4倍)。

4. 優化查詢與索引減少內存消耗

創建高效索引

全表掃描(無索引查詢)會加載大量數據到內存,導致內存占用飆升。需為高頻查詢字段(如_id、user_id、timestamp)創建索引,優先使用復合索引(覆蓋查詢字段)。
示例:為orders集合的user_idcreate_time字段創建索引:

db.orders.createIndex({ user_id: 1, create_time: -1 });

優化查詢語句

避免使用$where、$regex等低效操作符,盡量使用索引覆蓋查詢(返回字段均在索引中,無需加載數據文件)。
示例:使用投影限制返回字段(僅返回nameage):

db.users.find({ age: { $gt: 18 } }, { name: 1, age: 1, _id: 0 });

5. 定期清理與維護數據庫

壓縮數據文件

使用compact命令回收未使用的存儲空間(需停機執行),減少內存映射文件的大?。?/p>

use admin;
db.runCommand({ compact: 'your_collection_name' });

修復數據庫

使用repairDatabase命令整理數據文件,刪除損壞或無用的數據(需停機執行):

use admin;
db.runCommand({ repairDatabase: 1 });

設置TTL索引

臨時數據(如日志、會話)設置過期時間,自動刪除過期文檔,釋放內存:

db.logs.createIndex({ expire_at: 1 }, { expireAfterSeconds: 0 });  // 30天后過期

6. 監控內存使用情況

使用MongoDB自帶工具

  • mongostat:查看實時操作統計(如讀寫次數、內存使用);
  • mongotop:查看集合級別的讀寫時間(定位慢查詢)。
    示例mongostat --all(顯示所有集合的操作情況)。

使用Linux系統工具

  • top/htop:查看MongoDB進程的內存占用(RES列為核心內存使用);
  • free -h:查看系統內存使用情況(available列表示可用內存);
  • vmstat 1:查看內存、Swap、IO等系統指標(每秒刷新一次)。

7. 臨時釋放內存(緊急情況)

若服務器內存不足導致系統卡頓,可通過以下命令臨時釋放內存(不會重啟MongoDB,但會導致緩存失效,后續查詢變慢):

sync; echo 3 > /proc/sys/vm/drop_caches

說明sync命令將內存中的數據寫入磁盤,echo 3清除頁緩存、目錄項和inode緩存。

以上方法需根據服務器配置(內存大小、CPU核心數)、業務場景(讀寫比例、數據量)靈活調整。建議先在測試環境驗證效果,再應用到生產環境。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女