动态

详情 返回 返回

從單兵作戰到兵團壓測:PerfTest 分佈式集羣壓測實戰 - 动态 详情

前言

在前一篇文章中,我們詳細介紹了 perftest 的單機壓測能力,展示了它如何通過極簡的命令行實現對 HTTP/1.1、HTTP/2、HTTP/3 與 WebSocket 的高性能測試。然而,當業務系統龐大、服務部署分佈式、網絡鏈路複雜時,單機的壓測能力顯然無法滿足真實生產環境的模擬需求。

幸運的是,perftest 不止於單機。它同樣支持 分佈式集羣壓測,通過 Collector + Agent 的架構,讓你輕鬆在多台機器上同時發起測試,實現百萬乃至千萬級併發的性能評估。


為什麼選擇分佈式集羣壓測?

1. 還原真實流量場景
單機壓測無法模擬用户從不同地域、網絡環境、延遲條件下的訪問行為。而分佈式集羣壓測可以讓請求從多個地理節點同時發出,更貼近真實生產環境。

2. 突破性能瓶頸
當單機 CPU、內存或網絡帶寬達到極限時,測試結果已經不再準確。perftest 通過多機分流請求,避免了單節點成為瓶頸。

3. 驗證系統的水平擴展能力
當應用運行在 Kubernetes、Service Mesh 或微服務集羣中,分佈式壓測可以幫助你驗證系統在高併發場景下的負載均衡策略與彈性伸縮效果。

4. 提供更全面的數據觀察
集羣模式下的實時監控讓你不僅能看到整體的 QPS、延遲曲線,還能細分到每個 Agent 節點的性能分佈,精準定位性能瓶頸所在。


架構設計:Collector 與 Agent

perftest 的分佈式壓測系統採用了極簡、穩定的 Master-Agent(Collector-Agent)架構,框架圖如下:

  • Collector(主控節點)
    負責創建測試會話、調度所有 Agent、聚合性能指標,並在 Web UI 實時展示整體數據。
  • Agent(執行節點)
    實際執行壓測任務,定期將性能指標推送給 Collector。Agent 具備自動註冊、配置熱加載、斷線重連等機制,確保在大規模分佈式場景下穩定運行。

你可以想象成一個“指揮官(Collector)”指揮一支由多個“士兵(Agent)”組成的壓測軍團——只需一聲令下,所有節點同時開火。


工作原理:從註冊到彙總

整個壓測流程非常清晰:

  1. 啓動 Collector: Collector 服務啓動並提供一個 Web 管理界面。
  2. 創建測試會話: 在 Web 界面中,指定期望參與測試的 agent 節點數量,然後開始一個新的會話。
  3. 啓動 Agent: 每個 agent 啓動後,會讀取其配置文件並自動向 Collector 註冊。
  4. 開始測試: 一旦達到預設數量的 agent 完成註冊,Collector 會通知所有 agent 同時開始壓測。
  5. 匯聚結果: Agents 將性能數據(吞吐量、延遲等)實時推送到 Collector,由 Collector 在儀表盤上實時展示。
  6. 測試結束與報告導出: 壓測結束後,Collector 會自動生成完整的 Markdown 格式報告,可一鍵下載保存。
提示: Agent 會主動監聽其 agent.yml 配置文件。任何更改都會被自動熱加載,無需重啓 agent 進程,這使得調整測試參數非常便捷。


快速開始:一個簡單的集羣示例

以下是一個包含 1 個 Collector 與 3 個 Agent 的基礎集羣示例:

角色 IP 地址 説明
Collector 192.168.1.20 管理節點
Agent 1 192.168.1.101 執行節點
Agent 2 192.168.1.102 執行節點
Agent 3 192.168.1.103 執行節點

Step 1. 啓動 Collector

在機器 1 (192.168.1.20) 上,啓動 Collector 服務:

sponge perftest collector

瀏覽器訪問 http://192.168.1.20:8888,創建一個新的測試會話並設置 Agent 數量為 3。

Step 2. 啓動 Agents

每個 Agent 的配置文件 agent.yml 示例:

# 1. 協議配置 (支持: http | http2 | http3)
protocol: http

# 2. 目標 API 配置
testURL: "http://localhost:8080/get"
method: "GET"        # 支持的方法: GET | POST | PUT | PATCH | DELETE
body: ""             # 支持的數據類型: JSON, Form-data, Text. 例如: "{\"key\": \"value\"}"
headers:
  - "Authorization: Bearer <token>"
  #- "Content-Type: application/json"

# 3. 壓測策略 (二選一: 固定時長或固定請求數)
duration: 10s             # 例如: 10s, 1m, 2h
# total: 500000           # 總請求數

# 4. 服務發現,確保 collector 服務和 agent 服務能互相通信
collectorHost: "http://192.168.1.20:8888"     # Collector 服務的地址
agentHost: "http://<agent-host-ip>:6601"      # 當前 agent 可被訪問的 IP 和端口
agentPushInterval: 1s                         # 指標推送頻率

重要提示:

  • 請將 agentHost 中的 <agent-host-ip> 替換為每台 agent 機器的實際 IP
  • 對於同一次測試會話,所有 agent 配置文件中的 testURL 和 method 必須完全一致。

分別在機器 2、3、4 上啓動 agent 進程:

sponge perftest agent -c agent.yml

當 3 個 Agent 均註冊成功後,Collector 會自動同步啓動壓測並實時展示曲線圖表,如圖所示:

測試結束後,還可以點擊 “下載測試報告”,獲取詳細的 Markdown 報告,包括所有統計指標與圖表數據,用於後續分析或性能迴歸對比。


Kubernetes 場景下的自動化部署

對於大規模測試,手動管理節點是不現實的。perftest 可以輕鬆部署在 Kubernetes 上,讓您能夠毫不費力地擴展您的 agent 數量。

提供了一個完整的 yaml 部署清單和具體操作示例,請看文檔 在 Kubernetes 上部署 perftest。


橫向對比:分佈式壓測的“玩家們”

perftest 的分佈式能力同樣獨樹一幟。讓我們看看它與業內主流的分佈式壓測工具相比如何。

特性 / 工具 JMeter Locust k6 (Distributed) perftest (Distributed)
核心架構 GUI Master + Agents Code-based Master/Worker k6 Operator / CRD Web-UI Collector + Agents
測試定義 GUI (XML) Python 腳本 JavaScript 腳本 YAML 配置
資源消耗 高 (Java/GUI) 中 (Python/gevent) 中 (Go) 低 (Go)
K8s/雲原生 複雜 (需自行容器化) 良好 (提供 Helm Chart) 優秀 (原生 Operator) 原生友好 (提供部署清單)
上手難度 極低
動態配置 需重啓 需重啓 需重啓 (熱加載)
  • JMeter (The Veteran):功能最強大、最全面的壓測工具,擁有龐大的插件生態。但其基於 Java 和 GUI 的架構使其資源消耗巨大,在雲原生環境中的部署和自動化也相對笨重。
  • Locust (The Coder's Choice):用 Python 定義用户行為,對程序員非常友好,能夠輕鬆編寫複雜的業務邏輯。其 Master/Worker 架構清晰,但大規模部署時仍需一定的 DevOps 經驗。
  • k6 (The Modern Contender):k6 在分佈式測試方面與 Kubernetes 深度集成,通過 Operator 和 CRD (自定義資源) 的方式管理測試,是雲原生場景下的強大選擇。但它依然依賴於編寫 JavaScript 腳本來定義負載。
  • perftest (The Pragmatist)perftest 在分佈式場景下延續了其“簡單純粹”的哲學。它以配置取代了腳本,極大地降低了分佈式壓測的門檻。其 Collector + Agent 架構清晰易懂,通過 Web UI 即可發起和監控測試,並提供了開箱即用的 Kubernetes 部署文件。配置熱加載的特性更是讓調整測試參數變得異常高效,無需重新構建和部署,完美契合敏捷迭代的需求。


總結:從單點到集羣,簡約而不簡單

perftest 並非意圖取代 k6JMeter 這類功能全面的“瑞士軍刀”,而是為開發者和 SRE 工程師提供了一個更現代、更聚焦、更貼近雲原生生態的選擇。

它巧妙地覆蓋了性能測試的兩個核心場景:

  1. 對於單機壓測,它是一把鋒利的“手術刀”,讓你能以最低的學習成本,快速驗證和對比包括 HTTP/3WebSocket 在內的最新網絡協議,並通過與 Prometheus 的無縫集成,將性能數據融入可觀測性體系。
  2. 對於分佈式壓測,它是一個輕量級的“指揮中心”,通過簡潔的 Collector-Agent 架構和配置驅動的模式,將大規模壓測的複雜性降至最低。其對 Kubernetes 的原生友好性,使其能輕鬆擴展至成百上千個負載節點,模擬海量併發。

當你的需求是:

  • 單機或集羣壓測 http1/2/3 協議的服務或系統。
  • 快速驗證最新網絡協議(HTTP/3、WebSocket)的性能表現。
  • 將性能測試與 Prometheus 監控系統無縫打通,實現壓測過程的可視化。
  • 在 CI/CD 中進行輕量級的性能迴歸測試。
  • 無需編寫複雜腳本,就能快速搭建並執行大規模分佈式壓測。
  • 在 Kubernetes 環境中輕鬆實現壓測能力的彈性伸縮。

那麼,perftest 絕對值得你一試。在工具日趨複雜的今天,這樣一款能平滑地從“小而美”的單機工具擴展為“廣而強”的分佈式平台的利器,或許正是你一直在尋找的、應對現代 Web 性能挑戰的最佳答案。



perftestSponge 生態中的一個組件,Sponge 是一個功能強大且易於使用的 Go 開發框架,秉承“定義即代碼”(Definition is Code)的核心理念,通過低代碼方式輕鬆構建穩定、可靠的高性能後端服務,支持包括 RESTful API、gRPC、HTTP+gRPC 和 gRPC Gateway 等多種服務類型。Sponge 內置的 AI 助手能夠感知服務代碼文件及其上下文,在精準的 AI 約束下,智能生成更符合需求的業務邏輯代碼,顯著提升開發效率。

Sponge Github 地址:
https://github.com/go-dev-frame/sponge

user avatar soroqer 头像 kunaodejidan 头像 tyltr 头像 innsane 头像 tiandetuoba 头像 ruozxby 头像 jwgqwyq 头像 chenzhuodelanqiu_cl1nlj 头像 litao_2071 头像 weiwudejiqimao 头像 aihejiudejiqiren_bjjawt 头像 sayornottt 头像
点赞 16 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.