Files
ewoooc/docs/PERFORMANCE_ISSUE_ANALYSIS.md
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 01:21:13 +08:00

7.8 KiB
Raw Blame History

系統效能問題分析與解決方案

日期: 2026-01-14 問題: Grafana 儀表板載入緩慢、系統負載過高(最高達 36.00


🔍 問題根本原因

排程器重複執行問題

app.py:5560-5582 中,排程器在模組載入時自動初始化:

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 個 workersmomo.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 配置

    • CPU2 核心(正常負載應 < 2.0
    • RAM8 GB
    • 實際負載達到 36.0018倍超載

已採取的緊急措施

1. 停止 Grafana 服務(臨時)

sudo systemctl stop grafana-server

2. 終止所有 Chrome 程序

sudo pkill -9 -f 'chrome'
sudo pkill -9 -f 'chromedriver'

3. 停止獨立排程器

sudo kill 83742  # run_scheduler.py 程序

4. 修正 momo.service 配置

暫時停用 ExecStartPre=/bin/bash /home/ogt/momo_pro_system/kill_old_gunicorn.sh(該腳本在高負載下卡住導致服務無法啟動)

5. 重啟 MOMO 服務

sudo systemctl start momo

6. 重啟 Grafana 服務

sudo systemctl start grafana-server

結果

  • 系統負載從 36.00 降至 2.35
  • Grafana 恢復正常運行
  • 網站回應時間0.7 秒(可接受)

🛠️ 長期解決方案

方案 A完全停用內建排程器推薦

修改 app.py,註解掉自動初始化:

# V-New: 在模組載入時自動初始化排程Gunicorn 模式下也會執行)
# try:
#     init_scheduler()
# except Exception as e:
#     sys_log.error(f"❌ 排程器初始化失敗: {e}")

優點

  • 徹底解決重複執行問題
  • 降低系統資源消耗
  • 可手動通過 Web UI 觸發爬蟲任務(app.py:2388 /trigger-edm 路由)

缺點

  • 無法自動執行爬蟲任務
  • 需要手動觸發或使用獨立排程器

方案 B使用獨立排程器服務

  1. 使用現有的 run_scheduler.py,但降低執行頻率:
# 修改 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 自動匯入"))  # 保持每小時
  1. 創建 systemd 服務:
# /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
  1. 啟動服務:
sudo systemctl daemon-reload
sudo systemctl enable momo-scheduler
sudo systemctl start momo-scheduler

優點

  • 只有一個排程器實例運行
  • 資源消耗可控
  • 可通過 systemd 管理

缺點

  • 仍然消耗資源(每 4 小時一次相對可接受)
  • 需要額外的服務管理

方案 C優化爬蟲資源使用

修改爬蟲配置以降低 Chrome 資源消耗:

  1. 限制並行任務數:每次只運行 1-2 個爬蟲,不要同時運行多個

  2. 使用更輕量的 Chrome 選項(在 crawler/ 目錄中修改):

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')
  1. 考慮使用無頭模式替代方案
    • 使用 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/月

優點

  • 可以支持更多並行任務
  • 系統更穩定

缺點

  • 增加運營成本
  • 不解決根本問題(重複執行)

📋 推薦實施計劃

第一階段:立即執行(已完成)

  • 終止所有 Chrome 程序
  • 停止獨立排程器
  • 重啟 MOMO 和 Grafana 服務
  • 修正 Prometheus datasource URLhttp://localhost:9090/prometheus
  • 修正 DNS 監控配置(使用 8.8.8.8 DNS 伺服器)

第二階段:選擇並實施長期方案(待執行)

推薦:方案 A + 方案 B 組合

  1. 停用 app.py 中的自動排程器

    # 註解 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.pyrun_scheduler.py 中擇一啟用
    • 當前已停用 app.py 中的自動初始化
  2. 監控 Chrome 程序

    # 檢查 Chrome 程序數
    ps aux | grep -E 'chrome|chromedriver' | grep -v grep | wc -l
    
  3. 定期檢查系統負載

    uptime  # 1/5/15 分鐘平均負載應 < 2.02核CPU
    
  4. 日誌檔案輪換


🔗 相關文檔


文件版本: 1.0 最後更新: 2026-01-14 維護人員: MOMO Pro System Admin