HTTP基準(zhǔn)壓測(cè)工具wrk使用指南

前言
wrk是一個(gè)開(kāi)源的、熱門(mén)的、現(xiàn)代的單機(jī)HTTP基準(zhǔn)測(cè)試工具,目前在github開(kāi)源平臺(tái)累計(jì)了26.9k的star數(shù)目,足以可見(jiàn)wrk在Http基準(zhǔn)測(cè)試領(lǐng)域的熱門(mén)程度。它結(jié)合了多線程設(shè)計(jì)和可擴(kuò)展的事件通知系統(tǒng),如epoll和kqueue,可以在有限的資源下并發(fā)出極致的的負(fù)載請(qǐng)求。并且內(nèi)置了一個(gè)可選的LuaJIT腳本執(zhí)行引擎,可以處理復(fù)雜的HTTP請(qǐng)求生成、響應(yīng)處理以及自定義壓測(cè)報(bào)告。
wrk項(xiàng)目地址:https://github.com/wg/wrk
安裝wrk
mac下安裝:
brew install wrk
其他平臺(tái)參考:https://github.com/wg/wrk
基礎(chǔ)使用
wrk -t12 -c100 -d30s --latency http://localhost:8010/healthz
如上指令描述了采用12個(gè)線程,100個(gè)鏈接,針對(duì)http://localhost:8010/healthz 接口服務(wù),持續(xù)壓測(cè)30s。wrk本身不是依賴線程數(shù)來(lái)模擬并發(fā)數(shù)的所以線程數(shù)量設(shè)置在核心數(shù)左右最好,線程數(shù)多了測(cè)試系統(tǒng)消耗大,可能帶來(lái)反效果。親測(cè)核心數(shù)一致的線程數(shù)和兩倍核心數(shù)的線程數(shù),前者壓出的QPS更高。壓測(cè)結(jié)果如下:
Running 30s test @ http://localhost:8010/healthz (運(yùn)行30s測(cè)試) 12 threads and 100 connections(12個(gè)線程100個(gè)連接) Thread Stats Avg(均值) Stdev(標(biāo)準(zhǔn)差值) Max(最大值) +/- Stdev(正負(fù)標(biāo)準(zhǔn)差值) Latency(延遲) 1.39ms 668.10us 23.95ms 90.34% Req/Sec(每秒請(qǐng)求數(shù)) 5.44k 545.23 10.27k 76.47% Latency Distribution(延遲直方圖) 50% 1.32ms (50%請(qǐng)求延遲在1.32ms內(nèi)) 75% 1.49ms (75%請(qǐng)求延遲在1.49ms內(nèi)) 90% 1.72ms (90%請(qǐng)求延遲在1.72ms內(nèi)) 99% 4.77ms (99%請(qǐng)求延遲在4.77ms內(nèi)) 1952790 requests in 30.08s, 271.90MB read (共1952790次請(qǐng)求,用時(shí)30s,傳輸了271.9M數(shù)據(jù)) Requests/sec(每秒請(qǐng)求數(shù)): 64930.12 Transfer/sec(每秒傳輸數(shù)據(jù)): 9.04MB
wrk的結(jié)果相比ab測(cè)試結(jié)果來(lái)說(shuō),多了一個(gè)延時(shí)直方圖,有了這個(gè)直方圖,我們可以更清晰的看到延遲的分布情況。這也是博主選擇wrk最重要的原因
常用指令說(shuō)明
-c, --connections: 要保持打開(kāi)的HTTP連接的總數(shù),每個(gè)線程處理數(shù)N =連接/線程 -d, --duration: 測(cè)試持續(xù)時(shí)間, 如 2s, 2m, 2h -t, --threads: 測(cè)試線程總數(shù) -s, --script: 指定加載lua測(cè)試擴(kuò)展腳本 -H, --header: 添加請(qǐng)求頭信息, 如"User-Agent: wrk" --latency: 打印延遲直方圖信息 --timeout: 如果在此時(shí)間內(nèi)沒(méi)有收到響應(yīng),則記錄超時(shí). -開(kāi)頭的指令為簡(jiǎn)寫(xiě)的,后面兩個(gè)打印延遲直方圖和超時(shí)設(shè)置沒(méi)有簡(jiǎn)寫(xiě)的,只能--開(kāi)頭指定
高階用法,lua測(cè)試腳本
wrk內(nèi)置了全局變量,全局方法,以及五個(gè)測(cè)試請(qǐng)求發(fā)起流程的方法,還有一個(gè)模擬延遲發(fā)送的方法,wrk是內(nèi)置對(duì)象,在lua測(cè)試腳本的每個(gè)方法內(nèi)都可以直接使用
全局變量
-- 全局的變量 wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil, thread = userdata, }
全局方法
-- 返回請(qǐng)求字符串值,其中包含所傳遞的參數(shù)和來(lái)自wrk表的值。例如:返回 http://www.kailing.pub function wrk.format(method, path, headers, body); -- 獲取域名的IP和端口,返回table,例如:返回 `{127.0.0.1:80}` function wrk.lookup(host, service) -- 判斷addr是否能連接,例如:`127.0.0.1:80`,返回 true 或 false function wrk.connect(addr)
請(qǐng)求過(guò)程方法
-- 請(qǐng)求前,對(duì)每個(gè)線程調(diào)用一次,并接收表示該線程的userdata對(duì)象。 function setup(thread) thread.addr = "http://www.kailing.pub" -- 設(shè)置請(qǐng)求的地址 thread:get("name") -- 獲取全局變量的值 thread:set("name", "kl") -- 在線程的環(huán)境中設(shè)置全局變量的值 thread:stop() -- 停止線程 end --初始化,每個(gè)線程執(zhí)行一次 function init(args) --args為從命令行傳過(guò)來(lái)的額外參數(shù) print(args) end --發(fā)起請(qǐng)求,每次請(qǐng)求執(zhí)行一次,返回包含HTTP請(qǐng)求的字符串。每次構(gòu)建新請(qǐng)求的開(kāi)銷都很大,在測(cè)試高性能服務(wù)器時(shí), --一種解決方案是在init()中預(yù)先生成所有請(qǐng)求,并在request()中進(jìn)行快速查找。 function request() requests = requests + 1 return wrk.request() end --響應(yīng)處理,每次請(qǐng)求執(zhí)行一次 function response(status, headers, body) responses = responses + 1 end --請(qǐng)求完成,每次測(cè)試執(zhí)行一次。done()函數(shù)接收一個(gè)包含結(jié)果數(shù)據(jù)的表和兩個(gè)統(tǒng)計(jì)數(shù)據(jù)對(duì)象,分別表示每個(gè)請(qǐng)求延遲和每個(gè)線程請(qǐng)求速率。 --持續(xù)時(shí)間和延遲是微秒值,速率是以每秒請(qǐng)求數(shù)來(lái)度量的。 function done(summary, latency, requests) for index, thread in ipairs(threads) do local id = thread:get("id") local requests = thread:get("requests") local responses = thread:get("responses") local msg = "thread %d made %d requests and got %d responses" print(msg:format(id, requests, responses)) end end
整個(gè)腳本處理過(guò)程被分為準(zhǔn)備階段、運(yùn)行階段、完成階段。準(zhǔn)備階段在目標(biāo)IP地址被解析并且所有線程都已經(jīng)初始化但還沒(méi)有啟動(dòng)之后開(kāi)始。運(yùn)行階段從對(duì)init()的單個(gè)調(diào)用開(kāi)始,然后對(duì)每個(gè)請(qǐng)求周期調(diào)用request()和response()。init()函數(shù)接收腳本的任何額外命令行參數(shù),這些參數(shù)必須用“——”與wrk參數(shù)分隔開(kāi)。
lua測(cè)試腳本案例分析
案例:我們線上有一個(gè)帶緩存場(chǎng)景的接口服務(wù),根據(jù)appId的值的查詢結(jié)果緩存,所以,如果單純對(duì)指定的appId壓測(cè),就變成了測(cè)試緩存系統(tǒng)的負(fù)載了,測(cè)試不出實(shí)際的服務(wù)性能,這個(gè)場(chǎng)景就需要測(cè)試工具發(fā)起每次請(qǐng)求的測(cè)試參數(shù)都是動(dòng)態(tài)的。根據(jù)這個(gè)場(chǎng)景我們定制了如下的lua測(cè)試腳本:
-- 測(cè)試指令:wrk -t16 -c100 -d5s -sreview_digress_list.lua --latency htt://127.0.0.1:8081 wrk.method ="GET" wrk.path = "/app/{appId}/review_digress_list" function request() -- 動(dòng)態(tài)生成每個(gè)請(qǐng)求的url local requestPath = string.gsub(wrk.path,"{appId}",math.random(1,10)) -- 返回請(qǐng)求的完整字符串:http://127.0.0.1//app/666/review_digress_list return wrk.format(nil, requestPath) end
以上就是HTTP基準(zhǔn)壓測(cè)工具wrk使用指南的詳細(xì)內(nèi)容,更多關(guān)于HTTP壓測(cè)工具wrk使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決https網(wǎng)頁(yè)加載http資源報(bào)錯(cuò)問(wèn)題
這篇文章介紹了解決https網(wǎng)頁(yè)加載http資源報(bào)錯(cuò)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-12HTTPS協(xié)議數(shù)據(jù)加密傳輸基本內(nèi)容解析
很多網(wǎng)友了解過(guò)有關(guān)于網(wǎng)絡(luò)協(xié)議部分的內(nèi)容,HTTPS協(xié)議還是一知半解的,下面這邊文章就為大家簡(jiǎn)單介紹下HTTPS協(xié)議的基本內(nèi)容,大家了解下,希望對(duì)大家有幫助2017-03-21- 協(xié)議是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標(biāo)記語(yǔ)言(HTML)文檔從Web服務(wù)器傳送到2015-11-06
如何屏蔽https網(wǎng)站、禁止訪問(wèn)https、禁止跳轉(zhuǎn)https的方法
由于網(wǎng)絡(luò)安全形勢(shì)越發(fā)嚴(yán)峻,為了保護(hù)用戶隱私和網(wǎng)絡(luò)安全,越來(lái)越多的網(wǎng)站都開(kāi)啟了HTTPS,如何禁止訪問(wèn)HTTPS網(wǎng)站、如何屏蔽HTTPS網(wǎng)站就成為重要的網(wǎng)絡(luò)管理工作,下面就來(lái)看2017-03-29流媒體協(xié)議RTSP、HTTP、HTTPS、SDP四種區(qū)別解析
流媒體在Android中有nuplayer來(lái)實(shí)現(xiàn)的,下面先來(lái)講流媒體傳輸協(xié)議,了解了基本協(xié)議,本文主要講解RTSP,HTTP,HTTPS, SDP四種協(xié)議,一起來(lái)看看了解下,僅供參考2017-03-15- 報(bào)文是HTTP協(xié)議下請(qǐng)求和響應(yīng)的信息基礎(chǔ),這里就帶大家來(lái)逐步解讀HTTP報(bào)文的組成及含義,需要的朋友可以參考下2016-06-16