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

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