高性能 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)主機(jī)打開的空閑連接的最大數(shù)目疹鳄,默認(rèn)值為 10000拧略。 -duration duration 指定發(fā)送請求到目標(biāo)主機(jī)的時長,用 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 指定初始化進(jìn)程數(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)輸入進(jì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)容進(jìn)行壓測 - 創(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 進(jìn)行壓測 ``` $ 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)進(jìn)行大規(guī)模負(fù)載測試時某抓,通常由于受限于 Vegeta 自身機(jī)器的性能瓶頸(比如:打開的文件數(shù),內(nèi)存大小惰瓜,CPU 和 網(wǎng)絡(luò)帶寬)限制而無法達(dá)到預(yù)期結(jié)果否副。 這時分布式的使用 Vegeta 可以很好的解決這個問題,實現(xiàn)類似功能的工具很多崎坊,比如功能強(qiáng)大的 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)主機(jī)的操作,很方便的批量執(zhí)行命令和分發(fā)任務(wù)曲尸。Pdsh 還支持交互模式赋续,當(dāng)要執(zhí)行的命令不確定時,可直接進(jìn)入 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)通過時間戳進(jì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)系作者
  • 序言:七十年代末夕吻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子繁仁,更是在濱河造成了極大的恐慌涉馅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黄虱,死亡現(xiàn)場離奇詭異稚矿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捻浦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門晤揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朱灿,你說我怎么就攤上這事昧识。” “怎么了盗扒?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵跪楞,是天一觀的道長。 經(jīng)常有香客問我侣灶,道長甸祭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任炫隶,我火速辦了婚禮淋叶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己煞檩,他們只是感情好处嫌,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斟湃,像睡著了一般熏迹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凝赛,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天注暗,我揣著相機(jī)與錄音,去河邊找鬼墓猎。 笑死捆昏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毙沾。 我是一名探鬼主播骗卜,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼左胞!你這毒婦竟也來了寇仓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烤宙,失蹤者是張志新(化名)和其女友劉穎遍烦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躺枕,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡服猪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屯远。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔓姚。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慨丐,靈堂內(nèi)的尸體忽然破棺而出坡脐,到底是詐尸還是另有隱情,我是刑警寧澤房揭,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布备闲,位于F島的核電站,受9級特大地震影響捅暴,放射性物質(zhì)發(fā)生泄漏恬砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一蓬痒、第九天 我趴在偏房一處隱蔽的房頂上張望泻骤。 院中可真熱鬧,春花似錦、人聲如沸狱掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趋惨。三九已至鸟顺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間器虾,已是汗流浹背讯嫂。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留兆沙,地道東北人欧芽。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像挤悉,于是被迫代替她去往敵國和親渐裸。 傳聞我的和親對象是個殘疾皇子巫湘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容