轉載地址:http://www.tuicool.com/articles/IFjIJjU
wrk是一款現代化的http壓測工具,提供lua腳本的功能可以滿足每個請求或部分請求的差異化。
wrk中執行http請求的時候,調用lua分為3個階段,setup,running,done,每個wrk線程中都有獨立的腳本環境。
wrk的全局屬性
wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil, thread = <userdata>, }
wrk的全局方法
-- 生成整個request的string,例如:返回 -- GET / HTTP/1.1 -- Host: tool.lu 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)
Setup階段
setup是在線程創建之后,啟動之前。
function setup(thread) -- thread提供了1個屬性,3個方法 -- thread.addr 設置請求需要打到的ip -- thread:get(name) 獲取線程全局變量 -- thread:set(name, value) 設置線程全局變量 -- thread:stop() 終止線程
Running階段
function init(args) -- 每個線程僅調用1次,args 用於獲取命令行中傳入的參數, 例如 --env=pre function delay() -- 每個線程調用多次,發送下一個請求之前的延遲, 單位為ms function request() -- 每個線程調用多次,返回http請求 function response(status, headers, body) -- 每個線程調用多次,返回http響應
Done階段
可以用於自定義結果報表,整個過程中只執行一次
function done(summary, latency, requests) latency.min -- minimum value seen latency.max -- maximum value seen latency.mean -- average value seen latency.stdev -- standard deviation latency:percentile(99.0) -- 99th percentile value latency(i) -- raw value and count summary = { duration = N, -- run duration in microseconds requests = N, -- total completed requests bytes = N, -- total bytes received errors = { connect = N, -- total socket connection errors read = N, -- total socket read errors write = N, -- total socket write errors status = N, -- total HTTP status codes > 399 timeout = N -- total request timeouts } }
例子
表單的提交
wrk.method = "POST" wrk.body = "" -- 直接寫死,如果不需要請求數據的差異化 wrk.headers["Content-Type"] = "application/x-www-form-urlencoded" -- 如果要實現每次都不一樣的表單內容 local queries = { "language=php", "language=java", "language=lua" } local i = 0 request = function() local body = wrk.format(nil, nil, nil, queries[i % #queries + 1]) i = i + 1 return body end