作者:HelloGitHub-Anthony
這裡是 HelloGitHub 推出的《講解開源專案》系列,本期介紹一款標星 17.7k 純 Go 語言實現的 HTTP(S) 壓測工具——vegeta
Vegeta 是一款用 Go 語言編寫的多功能 HTTP(S) 壓測工具:安裝方便、功能齊全、使用簡單,還可作為命令列工具或者開發庫進行使用。它不僅提供了常見的壓測功能,還支援格式化結果並輸出為圖表或動態顯示當前結果。
通過本文你將掌握這款強大壓測工具的基本用法,讓壓測只需一條命令!
一、 安裝
從倉庫下載編譯好的二進位制檔案:
PC 上下載 amd64 版本即可,在 Mac Os X 上使用 Homebrew 安裝:
$ brew update && brew install vegeta
複製程式碼
如果你會 Go 語言,使用 get
自動安裝:
$ go get -u github.com/tsenart/vegeta
複製程式碼
如提示找不到指令,請確保 go 以及 GOBIN 在您的環境變數中
二、快速入門
以下指令均可以在 Linux 下執行
對於下載編譯好的使用者建議先將 vegeta 臨時新增到 PATH 路徑,方便使用:
$ cd vegeta
$ export PATH=$pwd:$PATH
複製程式碼
或者直接將 vegeta 放到 bin 目錄下:
$ cd vegeta
$ sudo mv vegeta /usr/local/bin/
複製程式碼
輸入 vegeta -version
後可以顯示證明安裝成功。
首次使用可以使用:
$ vegeta --help
複製程式碼
來檢視支援的指令和相關例子。
1. 使用例子
在命令列輸入:
$ echo "GET http://127.0.0.1:233"| vegeta attack -rate=500 -connections=1 -duration=1s | tee results.bin | vegeta report
複製程式碼
將會得到如圖所示的結果:
這條指令前半部分的 echo "GET http://127.0.0.1:233"
表示想要測試的地址,這裡我使用的是 nginx 搭建的本地伺服器,vegeta attack
代表測試指令,其後 -rate
-connections
-duration
分別表示每秒鐘請求次數、每個地址最大連線數、持續時間。
攻擊完成後使用 tee results.bin
儲存測試報告並用 veteta report
顯示報告內容。
vegeta report
也支援使用 文字、JSON、直方圖、hdrplot 等:
$ echo "GET http://127.0.0.1:233"| vegeta attack -rate=500 -connections=1 -duration=5s > results.bin
複製程式碼
文字(預設情況)
$ vegeta report results.bin
複製程式碼
直方圖
$ vegeta report -type='hist[0,1ms,2ms,3ms,4ms]' results.bin
複製程式碼
JSON
$ vegeta report --type json results.bin
複製程式碼
hdrplot
$ vegeta report --type hdrplot results.bin
複製程式碼
2.生成圖形
接上一小節
的內容,我們將文字形式的報告轉為圖表顯示,在命令列中輸入:
$ vegeta plot --title HelloGitHub results.bin > plot.html
複製程式碼
在瀏覽器中開啟新生成的 plot.html
,即可看到圖形化的測試資料:
其中 --title HelloGitHub
用來設定表頭文字。此外還有
-cpu
用來設定預設使用的 cpu 核心數量,這裡我預設是 12。可以使用 --threshold
flag 設定下采樣閾值。
vegeta plot 也可以將多個曲線放在一起,使用 vegeta plot result_1.bin result2_.bin ... result_n.bin > plot.html 即可
此外,配合 Go 下的 jaggr
和 jplot
可以實現動態畫面輸出,官方給出的指令和效果如下:
$ echo 'GET http://localhost:8080' | \
vegeta attack -rate 5000 -duration 10m | vegeta encode | \
jaggr @count=rps \
hist\[100,200,300,400,500\]:code \
p25,p50,p95:latency \
sum:bytes_in \
sum:bytes_out | \
jplot rps+code.hist.100+code.hist.200+code.hist.300+code.hist.400+code.hist.500 \
latency.p95+latency.p50+latency.p25 \
bytes_in.sum+bytes_out.sum
複製程式碼
由於 jplot 需要 iTerm2 但筆者沒有蘋果系列的電腦所以關於動態輸出部分的內容大家需要自己研究。
3.使用管道
如果您瞭解 Shell 的管道那就不難看出,前文程式碼中就是使用管道將 echo "GET http:// xxx"
的輸出內容傳給了 vegeta
。通過管道,除了使用簡單的 echo
工具,也可以使用其他任何程式的輸出作為測試目標。
4.轉換編碼
vegeta 同樣提供了編碼轉換功能,現在支援三種編碼格式:Gob (二進位制)、CSV 以及 JSON(預設) 使用 veget encode
可以做到這幾種編碼的相互轉換:
$ echo "GET http://127.0.0.1:233"| vegeta attack -rate=500 -connections=1 -duration=1s > results.gob
$ cat results.gob | vegeta encode | jq .
複製程式碼
可以顯示轉換為 JSON 格式的測試資訊,或者:
$ cat results.gob | vegeta encode --to csv --output results.csv
複製程式碼
輸入格式的檢測是自動完成的,不需要手動進行設定。
三、結語
到這裡 vegeta 的基本使用到這裡就結束了,它還支援一些精細引數的設定比如證書、金鑰等,但限於篇幅和筆者知識水平限制無法擴充套件太多,大家可以根據需要的使用 vegeta [command] --help
指令進行檢視,也可以閱讀官方的使用手冊
溫馨提示:壓測雖好玩但不要貪杯哦,別壓起勁兒來把線上服務給壓掛了!
關注 HelloGitHub 公眾號 第一時間收到更新。
還有更多開源專案的介紹和寶藏專案等待你的發現。