iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
生成式 AI

打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記系列 第 27

[Day 27] 壓測與穩定性分析:模擬真實使用者

  • 分享至 

  • xImage
  •  

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-27


在前一天,我們已經能用 Prometheus + Grafana 看到平台的任務與系統指標。
但這些數字的意義只有在真實負載下才成立。
因此,今天的目標是模擬真實使用者的行為,觀察整個系統在壓力下的反應。

一、從指標到行為

傳統的壓測工具多半只是「打 API」,而我們的目標更進一步:

不只是測試 FastAPI 的吞吐量,而是驗證整個 任務系統鏈路(API → Celery → Redis → Worker)。

這樣才能知道:

  • 登入流程是否穩定?
  • /train 任務能否被正確排入佇列?
  • 高並發時 worker 是否能及時處理?
  • Prometheus 指標是否能即時反映壓力變化?

二、壓測設計理念

1️⃣ 模擬真實行為,而非暴力請求

使用 Locust 建立 TrainUser 類別,模擬一般使用者的行為循環:

  1. 登入 /auth/login
  2. 取得 token 並存入 headers
  3. 週期性呼叫 /train 提交任務

這樣的壓測能驗證整個認證與任務流程,而不是單純的 API 打點。

2️⃣ 驗證系統可承受的穩定區間

設定使用者數量(例如 50 位)、任務間隔(1–3 秒),並限制最大請求數。
測試目標不是「讓系統崩潰」,而是觀察系統何時開始出現延遲,並找出穩定區間。

範例邏輯(簡化):

class TrainUser(HttpUser):
    def on_start(self):
        # 登入一次並保存 Token
        response = self.client.post("/auth/login", json={"username": "demo", "password": "demo"})
        token = response.json()["token"]
        self.client.headers.update({"Authorization": f"Bearer {token}"})

    @task
    def submit_train_job(self):
        # 提交訓練任務
        payload = {"config_path": "config/default.yaml"}
        self.client.post("/train", json=payload)

三、測試結果觀察

https://ithelp.ithome.com.tw/upload/images/20251007/20151660G8PRUEfVHR.png

這張圖板整合了 任務執行效率系統資源使用狀況
可以在一次壓測後直觀看出整個平台的「穩定度」。
整體分為四個指標區塊:

  1. Task Success / Total Count

    • 兩個計數器分別顯示任務成功數與總任務數。
    • 兩者曲線同步上升,代表沒有任務失敗,系統成功處理了全部請求。
  2. Task Queue Length

    • 初始佇列長度約為 9,隨著 Worker 消化任務逐步下降至 0。
    • 曲線平滑下降,代表任務處理速率穩定,沒有出現「積壓」或「波動」。
  3. Average Task Duration

在這裡,為了方便觀察,我將指標顯示內容改為平均任務耗時

  • 平均任務耗時在測試初期有一次尖峰(約 1 分鐘),
    之後逐步下降並穩定在 20~30 秒區間。
  • 顯示系統在冷啟後能自我調整,達成穩定執行。
  1. System Resource Usage (CPU / Memory)

    • CPU 使用率呈現週期性波動,代表 Worker 在週期性任務間切換。
    • 記憶體使用率維持低位且穩定,顯示整體運行輕量、未發生記憶體洩漏。

四、結果與分析

整體觀察顯示,平台在 高併發 + 重複提交訓練任務 的情境下表現穩定:

  • 吞吐穩定:任務全部成功,無超時、無失敗。
  • 負載均衡:Queue 線性下降,Worker 處理速率一致。
  • 資源健康:CPU 具週期性波動但不過載,Memory 幾乎維持水平。
  • 冷啟自穩:初期高耗時屬正常預熱階段,之後曲線平緩。

這次壓測證明了整個訓練與任務系統具備「穩定消化任務、可預期資源使用」的特性,
是進入 Day 28 多租戶與治理階段前,系統可靠性驗證 的重要里程碑。


這一天的成果,讓我們從「觀測系統」進化為「理解系統」。
壓測不只是找出誰慢,而是讓工程師能夠預測系統在壓力下的行為

Prometheus 是眼睛,Grafana 是儀表板,而 Locust 就是風洞。
三者合在一起,讓平台從「能跑起來」變成「跑得穩」。


📎 AI 協作記錄:今日開發指令

# 1️⃣ 建立壓測腳本
請幫我建立 tests/load_test.py:
- 使用 Locust
- 模擬 50 位使用者,每 1~3 秒送一次 /train 任務
- 持續 5 分鐘
- 無介面模式運行,輸出平均響應時間與成功率

# 2️⃣ Makefile 新增
make load-test:
	locust -f tests/load_test.py --headless -u 50 -r 5 -t 5m

# 3️⃣ 壓測後分析
請幫我在 Grafana 中設定 dashboard 查詢:
- task_success_total / task_failure_total
- task_queue_length
- task_duration_seconds 平均值
- system_cpu_percent / system_memory_usage_gigabytes

上一篇
[Day 26] 系統觀測:Prometheus Exporter + Grafana
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言