高性能 HTTP 負(fù)載測試工具 Vegeta

# 什么是 Vegeta Vegeta 是一個用 Go 語言編寫的多功能的 HTTP 負(fù)載測試工具,它提供了命令行工具和一個開發(fā)庫。 官方地址:https://github.com/tsenart/vegeta # 安裝 Vegeta Vegeta 安裝非常簡單,由于 Go 語言良好的跨平臺性,可以直接下載官方的預(yù)編譯版本后開箱即用。 預(yù)編譯版本 這里以 Linux 版本為例: ``` $ wget https://github.com/tsenart/vegeta/releases/download/v7.0.3/vegeta-7.0.3-linux-amd64.tar.gz $ tar xzvf vegeta-7.0.3-linux-amd64.tar.gz $ mv vegeta /usr/local/bin/ ``` 如果你使用的是其它平臺,可根據(jù)實際情況在官網(wǎng)下載頁面下載對應(yīng)版本解壓后就可以使用。 - macOS ``` $ brew install vegeta ``` # Vegeta 用法 ``` $ vegeta --help Usage: vegeta [global flags] [command flags] global flags: -cpus int 使用 CPU 的數(shù)量 (默認(rèn)為 4 個) -profile string 指定在執(zhí)行期間啟用哪個分析器,支持 cpu 和 heap。 -version 打印版本并退出。 attack command: -body string 指定請求主體文件里的內(nèi)容。 -cert string 指定用于 HTTPS 請求的 PEM 格式的客戶端證書文件。如果 -key 未指定,它會被設(shè)置為這個標(biāo)志的值。 -connections int 指定每個目標(biāo)主機打開的空閑連接的最大數(shù)目,默認(rèn)值為 10000。 -duration duration 指定發(fā)送請求到目標(biāo)主機的時長,用 0 表示永久。 -header value 指定目標(biāo)的請求頭,可以重復(fù)指定多個請求頭。 -http2 指定是否向支持的服務(wù)器發(fā)送 HTTP/2 請求,默認(rèn)為:true。 -insecure 指定是否忽略無效的服務(wù)器 TLS 證書。 -keepalive 指定是否使用持久鏈接,默認(rèn)值為:true。 -key string 指定 HTTPS 請求中使用的 PEM 編碼的 SSL 客戶端證書私鑰文件。 -laddr value 指定要使用的本地 I P地址,默認(rèn)值為:0.0.0.0。 -lazy 指定是否使用延遲模式讀取目標(biāo)。 -output string 指定輸出文件的位置,默認(rèn)為標(biāo)準(zhǔn)輸出。 -rate uint 指定每秒鐘對目標(biāo)發(fā)送的請求數(shù),默認(rèn)值為:50。 -redirects int 指定每個請求的重定向的最大次數(shù),默認(rèn)為 10 次。當(dāng)值為 -1, 不會遵循重定向但響應(yīng)標(biāo)記為成功。 -root-certs value 指定可信的 TLS 根證書文件,多個的情況下使用逗號分隔。如果未指定,使用系統(tǒng)默認(rèn)的 CA 證書。 -targets string 指定目標(biāo)文件,默認(rèn)為標(biāo)準(zhǔn)輸入。 -timeout duration 指定每個請求的超時時間,默認(rèn)值為 30s。 -workers uint 指定初始化進程數(shù)量,默認(rèn)值為 10。 report command: -inputs string 指定報告輸入文件,默認(rèn)為標(biāo)準(zhǔn)輸入。 -output string 指定報告輸出文件,默認(rèn)為標(biāo)準(zhǔn)輸出。 -reporter string 指定要生成的報告的格式,支持 text,json, plot, hist[buckets]。默認(rèn)為文本。 dump command: -dumper string 指定轉(zhuǎn)存文件,支持 json, csv 格式。默認(rèn)為 json 格式。 -inputs string 指定要轉(zhuǎn)存的輸入文件,默認(rèn)為標(biāo)準(zhǔn)輸入,指定多個用逗號分隔。 -output string 指定要轉(zhuǎn)存的輸出文件,默認(rèn)為標(biāo)準(zhǔn)輸出。 ``` ## Vegeta 使用實例 ## 使用標(biāo)準(zhǔn)輸入進行壓測并生成報告 ``` $ echo "GET http://www.hi-linux.com/img/linux/docker-dry-01.png" | vegeta attack -rate=50 -connections=1 -duration=1s | tee results.bin | vegeta report Requests [total, rate] 50, 51.02 Duration [total, attack, wait] 37.41975091s, 979.999689ms, 36.439751221s Latencies [mean, 50, 95, 99, max] 33.816664905s, 35.021110945s, 37.058121168s, 37.204824958s, 37.319751221s Bytes In [total, mean] 9505000, 190100.00 Bytes Out [total, mean] 0, 0.00 Success [ratio] 100.00% Status Codes [code:count] 200:50 Error Set: ``` ## 使用目標(biāo)文件的內(nèi)容進行壓測 - 創(chuàng)建 target.txt 文件,內(nèi)容如下: ``` $ vim target.txt GET http://www.hi-linux.com/ GET http://www.hi-linux.com/posts/19779.html GET http://www.hi-linux.com/img/linux/docker-dry-01.png ``` - 使用 Vegeta 進行壓測 ``` $ vegeta attack -targets="target.txt" -rate=10 -duration=2s > results.bin ``` - 自定義目標(biāo)文件 除了前面定義的最簡單 HTTP GET 請求外,你還可以定義下面這些更靈活更復(fù)雜的 HTTP 請求: 1. 自定義請求頭 ``` GET http://user:password@hi-linux.com:80/path/to X-Account-ID: 8675309 DELETE http://hi-linux.com:80/path/to/remove Confirmation-Token: 90215 Authorization: Token DEADBEEF ``` 2.自定義請求的主體 ``` POST http://hi-linux.com:80/things @/path/to/newthing.json PATCH http://hi-linux.com:80/thing/71988591 @/path/to/thing-71988591.json ``` 3. 自定義請求頭和請求主體 ``` POST http://hi-linux.com:80/things X-Account-ID: 99 @/path/to/newthing.json ``` # 生成壓測報告 - 生成 JSON 格式的壓測報告 ``` $ vegeta report -inputs=results.bin -reporter=json > metrics.json ``` - 生成基于 [Dygraphs](http://dygraphs.com/) 的 HTML 5 壓測報告 ``` $ cat results.bin | vegeta report -reporter=plot > plot.html ``` ![](https://upload-images.jianshu.io/upload_images/28338950-467307eeb74db9ad.png) - 計算并輸出一個基于文本的直方圖 ``` $ cat results.bin | vegeta report -reporter="hist[0,2ms,4ms,6ms]" Bucket # % Histogram [0, 2ms] 6007 32.65% ######################## [2ms, 4ms] 5505 29.92% ###################### [4ms, 6ms] 2117 11.51% ######## [6ms, +Inf] 4771 25.93% ################### ``` - 生成實時圖形壓測報告 如果您是 iTerm 用戶,可以使用 jaggr 將 Vegeta 與 jplot 整合在一起并在終端上實時繪制壓測報告。要實現(xiàn)這個功能你首先需要先安裝 jaggr 和 jplot: 1. 安裝 jaggr ``` # macOS $ brew install rs/tap/jaggr # 源代碼安裝 $ go get -u github.com/rs/jaggr ``` 2. 安裝 jplot ``` # macOS $ brew install rs/tap/jplot # 源代碼安裝 go get -u github.com/rs/jplot ``` 安裝完 jaggr 和 jplot 后,其次你需要在 iTerm 中執(zhí)行以下命令: ``` $ echo 'GET http://www.hi-linux.com' | \ vegeta attack -rate 50 -duration 5m | vegeta dump | \ 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 ``` ![](https://upload-images.jianshu.io/upload_images/28338950-b9d1b4a113cc7db6.png) # 分布式壓力測試 當(dāng)進行大規(guī)模負(fù)載測試時,通常由于受限于 Vegeta 自身機器的性能瓶頸(比如:打開的文件數(shù),內(nèi)存大小,CPU 和 網(wǎng)絡(luò)帶寬)限制而無法達(dá)到預(yù)期結(jié)果。 這時分布式的使用 Vegeta 可以很好的解決這個問題,實現(xiàn)類似功能的工具很多,比如功能強大的 Ansible。這里我們使用 Pdsh 來實現(xiàn): ``` $ pdsh -b -w '10.0.1.1,10.0.2.1,10.0.3.1' \ 'echo "GET http://target/" | vegeta attack -rate=20000 -duration=60s > result.bin' ``` > Pdsh 的全稱是 (Parallel Distributed Shell),Pdsh 可并行的執(zhí)行對目標(biāo)主機的操作,很方便的批量執(zhí)行命令和分發(fā)任務(wù)。Pdsh 還支持交互模式,當(dāng)要執(zhí)行的命令不確定時,可直接進入 Pdsh命令行,非常方便。 完成前面的命令后,我們就可以通過 Shell 腳本將結(jié)果文件收集到的一起供后面生成報表時使用。 ``` $ for machine in "10.0.1.1 10.0.2.1 10.0.3.1"; do scp $machine:~/result.bin $machine.bin & done ``` 最后我們可以通過 vegeta report 命令生成此次壓測的報表。vegeta report 命令可一次性讀取使用逗號分隔的多個結(jié)果文件并生成報告,默認(rèn)通過時間戳進行排序。 ``` $ vegeta report -inputs="10.0.1.1.bin,10.0.2.1.bin,10.0.3.1.bin" Requests [total, rate] 3600000, 60000.00 Latencies [mean, 95, 99, max] 223.340085ms, 326.913687ms, 416.537743ms, 7.788103259s Bytes In [total, mean] 3714690, 3095.57 Bytes Out [total, mean] 0, 0.00 Success [ratio] 100.0% Status Codes [code:count] 200:3600000 Error Set: ``` # 其它相關(guān) 如果你覺得命令行下使用 Vegeta 比較復(fù)雜的話,你還可以使用 Alex 項目。Alex 是一個基于 Vegeta Library 和 Boom 封裝的壓力測試 Web UI,Vegeta 提供穩(wěn)定的 QPS 壓力源,Boom 提供穩(wěn)定的并發(fā)數(shù)壓力源。 項目地址:https://github.com/ireaderlab/alex - Alex 架構(gòu)圖 ![](https://upload-images.jianshu.io/upload_images/28338950-c4cf87684b9bb2b3.png) Alex 效果圖 ![](https://upload-images.jianshu.io/upload_images/28338950-08644eb7d8952e24.png) ![](https://upload-images.jianshu.io/upload_images/28338950-b7a97eda52439baa.png) 參考文檔 - http://www.google.com - http://t.cn/RBqHjIu - http://t.cn/zQ104Zp - http://t.cn/R5spIPf > 原文地址 https://www.hi-linux.com/posts/4650.html 關(guān)注 golang技術(shù)實驗室 獲取更多好文 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容