# 系統效能問題分析與解決方案 **日期**: 2026-01-14 **問題**: Grafana 儀表板載入緩慢、系統負載過高(最高達 36.00) --- ## 🔍 問題根本原因 ### 排程器重複執行問題 在 [`app.py:5560-5582`](../app.py#L5560-L5582) 中,排程器在模組載入時自動初始化: ```python def init_scheduler(): """初始化排程任務(Gunicorn 模式下也會執行)""" schedule.every(1).hours.do(run_momo_task) # 商品看板爬蟲 schedule.every(1).hours.do(run_edm_task) # EDM 限時搶購爬蟲 schedule.every(1).hours.do(run_festival_task) # 購物節活動爬蟲 schedule.every(30).minutes.do(run_auto_import_task) # Google Drive 自動匯入 schedule.every(30).minutes.do(run_whitepage_check) # 網頁白頁監控 scheduler_thread = threading.Thread(target=run_schedule, daemon=True) scheduler_thread.start() # 在模組載入時自動初始化 try: init_scheduler() except Exception as e: sys_log.error(f"❌ 排程器初始化失敗: {e}") ``` **問題**:Gunicorn 配置為 4 個 workers([momo.service](../momo.service)),**每個 worker 都會執行 `init_scheduler()`**! ### 資源消耗計算 - **每小時執行**: - 4 workers × 3 個爬蟲任務 = **12 個 Chrome/Selenium 實例同時運行** - 每個 Chrome 實例消耗:15-30% CPU + 200-500 MB RAM - 總計:**100%+ CPU** + **2-3 GB RAM** - **每 30 分鐘執行**: - 4 workers × 2 個任務(auto_import + whitepage_check) - 額外增加系統負載 - **VM 配置**: - CPU:2 核心(正常負載應 < 2.0) - RAM:8 GB - **實際負載達到 36.00(18倍超載!)** --- ## ✅ 已採取的緊急措施 ### 1. 停止 Grafana 服務(臨時) ```bash sudo systemctl stop grafana-server ``` ### 2. 終止所有 Chrome 程序 ```bash sudo pkill -9 -f 'chrome' sudo pkill -9 -f 'chromedriver' ``` ### 3. 停止獨立排程器 ```bash sudo kill 83742 # run_scheduler.py 程序 ``` ### 4. 修正 momo.service 配置 暫時停用 `ExecStartPre=/bin/bash /home/ogt/momo_pro_system/kill_old_gunicorn.sh`(該腳本在高負載下卡住導致服務無法啟動) ### 5. 重啟 MOMO 服務 ```bash sudo systemctl start momo ``` ### 6. 重啟 Grafana 服務 ```bash sudo systemctl start grafana-server ``` ### 結果 - 系統負載從 **36.00 降至 2.35** - Grafana 恢復正常運行 - 網站回應時間:0.7 秒(可接受) --- ## 🛠️ 長期解決方案 ### 方案 A:完全停用內建排程器(推薦) 修改 `app.py`,註解掉自動初始化: ```python # V-New: 在模組載入時自動初始化排程(Gunicorn 模式下也會執行) # try: # init_scheduler() # except Exception as e: # sys_log.error(f"❌ 排程器初始化失敗: {e}") ``` **優點**: - 徹底解決重複執行問題 - 降低系統資源消耗 - 可手動通過 Web UI 觸發爬蟲任務([app.py:2388](../app.py#L2388) `/trigger-edm` 路由) **缺點**: - 無法自動執行爬蟲任務 - 需要手動觸發或使用獨立排程器 --- ### 方案 B:使用獨立排程器服務 1. 使用現有的 `run_scheduler.py`,但降低執行頻率: ```python # 修改 run_scheduler.py (第 54-68 行) schedule.every(4).hours.do(safe_task_wrapper(run_momo_task, "商品看板爬蟲")) # 改為每 4 小時 schedule.every(4).hours.do(safe_task_wrapper(run_edm_task, "EDM 限時搶購爬蟲")) schedule.every(4).hours.do(safe_task_wrapper(run_festival_task, "購物節活動爬蟲")) schedule.every(1).hours.do(safe_task_wrapper(run_auto_import_task, "Google Drive 自動匯入")) # 保持每小時 ``` 2. 創建 systemd 服務: ```ini # /etc/systemd/system/momo-scheduler.service [Unit] Description=MOMO Pro Scheduler Service After=network.target momo.service [Service] Type=simple User=ogt WorkingDirectory=/home/ogt/momo_pro_system ExecStart=/home/ogt/momo_pro_system/venv/bin/python3 /home/ogt/momo_pro_system/run_scheduler.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` 3. 啟動服務: ```bash sudo systemctl daemon-reload sudo systemctl enable momo-scheduler sudo systemctl start momo-scheduler ``` **優點**: - 只有一個排程器實例運行 - 資源消耗可控 - 可通過 systemd 管理 **缺點**: - 仍然消耗資源(每 4 小時一次相對可接受) - 需要額外的服務管理 --- ### 方案 C:優化爬蟲資源使用 修改爬蟲配置以降低 Chrome 資源消耗: 1. **限制並行任務數**:每次只運行 1-2 個爬蟲,不要同時運行多個 2. **使用更輕量的 Chrome 選項**(在 `crawler/` 目錄中修改): ```python chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--single-process') # 單進程模式 chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--disable-software-rasterizer') ``` 3. **考慮使用無頭模式替代方案**: - 使用 `requests` + `BeautifulSoup`(如果網站允許) - 使用 `playwright`(比 Selenium 更輕量) **優點**: - 降低單個爬蟲的資源消耗 - 可以繼續使用現有架構 **缺點**: - 需要修改現有爬蟲代碼 - 可能影響爬蟲功能(如果網站需要 JavaScript 渲染) --- ### 方案 D:升級 VM 配置 如果爬蟲任務頻繁且重要,考慮升級 VM: - **目前**:e2-medium (2 vCPU, 8GB RAM) - **建議**:e2-standard-2 (2 vCPU, 8GB RAM) 或 e2-standard-4 (4 vCPU, 16GB RAM) **成本影響**: - e2-medium: ~$25/月 - e2-standard-4: ~$100/月 **優點**: - 可以支持更多並行任務 - 系統更穩定 **缺點**: - 增加運營成本 - 不解決根本問題(重複執行) --- ## 📋 推薦實施計劃 ### 第一階段:立即執行(已完成) - [x] 終止所有 Chrome 程序 - [x] 停止獨立排程器 - [x] 重啟 MOMO 和 Grafana 服務 - [x] 修正 Prometheus datasource URL(`http://localhost:9090/prometheus`) - [x] 修正 DNS 監控配置(使用 8.8.8.8 DNS 伺服器) ### 第二階段:選擇並實施長期方案(待執行) **推薦:方案 A + 方案 B 組合** 1. **停用 app.py 中的自動排程器** ```python # 註解 app.py 第 5579-5582 行 ``` 2. **配置獨立排程器服務**(降低頻率至每 4 小時) - 修改 `run_scheduler.py` - 創建 `momo-scheduler.service` - 啟動服務 3. **添加資源監控告警**(使用 Grafana) - CPU 使用率 > 70% 持續 5 分鐘 → 告警 - 記憶體使用率 > 80% → 告警 - Chrome 程序數 > 5 → 告警 ### 第三階段:優化(可選) - 優化 Chrome 選項以降低資源消耗 - 評估是否可用輕量級爬蟲替代 Selenium - 考慮使用任務隊列(如 Celery)管理爬蟲任務 --- ## 📊 效能改善對比 | 指標 | 問題發生時 | 修復後 | |------|------------|--------| | CPU 負載(1分鐘) | 36.00 | 2.35 | | Chrome 程序數 | 40+ | 0 | | 記憶體使用 | 5.0GB / 7.8GB (64%) | 0.9GB / 7.8GB (12%) | | Grafana 回應時間 | > 10 秒 | 0.02-3.3 秒 | | MOMO 網站回應 | 超時/緩慢 | 0.7 秒 | --- ## ⚠️ 注意事項 1. **不要同時運行多個排程器**: - 只能在 `app.py` 或 `run_scheduler.py` 中擇一啟用 - 當前已停用 `app.py` 中的自動初始化 2. **監控 Chrome 程序**: ```bash # 檢查 Chrome 程序數 ps aux | grep -E 'chrome|chromedriver' | grep -v grep | wc -l ``` 3. **定期檢查系統負載**: ```bash uptime # 1/5/15 分鐘平均負載應 < 2.0(2核CPU) ``` 4. **日誌檔案輪換**: - 已配置 logrotate (參考: [docs/DEPLOYMENT_WORKFLOW.md](DEPLOYMENT_WORKFLOW.md)) - 爬蟲日誌可能快速增長,需定期檢查 --- ## 🔗 相關文檔 - [Telegram 告警設定](TELEGRAM_ALERT_SETUP.md) - [部署工作流程](DEPLOYMENT_WORKFLOW.md) - [CI/CD 評估報告](CI_CD_EVALUATION.md) --- **文件版本**: 1.0 **最後更新**: 2026-01-14 **維護人員**: MOMO Pro System Admin