一个HTTP压力测试软件

许多用法从wrkGithub主页上即可看到. 安装的话, 参考这里就可以: Wrk安装方式.

  • 我就不介绍简单的用法了, 打开Git直接看吧.

官方的介绍的POST请求

下面是一个官方给出的例子, 只是实现了POST方法, 但是其实是可以有一些扩展的.

1
2
3
4
5
6
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header

wrk.method = "POST"
wrk.body = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

如何实现动态请求

  • 从上面的例子中可以看到, 这段lua代码似乎没有给我们增加变量的选择, 只能 单纯的赋值.

参考counter.lua

这是一个类似计数器的请求, 但是, 我想要实现的是POST请求, 这个毫无疑问是 GET请求. 但是有一点可以确定, 这里给出了一个request函数, 也就是说, 我们可以重写这个函数来实现自己想要的效果.

1
2
3
4
5
6
7
8
counter = 0

request = function()
path = "/" .. counter
wrk.headers["X-Counter"] = counter
counter = counter + 1
return wrk.format(nil, path)
end

没办法了, 读读源码吧.

其实不需要全部读一遍, 看看src/wrk.lua就行了.

里面有几句是这样的, 回望counter.lua, 原来只要把request函数自己实现了就可以.

1
2
3
4
local req = wrk.format()
wrk.request = function()
return req
end

然后我们再看看wrk.format的实现方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function wrk.format(method, path, headers, body)
local method = method or wrk.method
local path = path or wrk.path
local headers = headers or wrk.headers
local body = body or wrk.body
local s = {}

if not headers["Host"] then
headers["Host"] = wrk.headers["Host"]
end

headers["Content-Length"] = body and string.len(body)

s[1] = string.format("%s %s HTTP/1.1", method, path)
for name, value in pairs(headers) do
s[#s+1] = string.format("%s: %s", name, value)
end

s[#s+1] = ""
s[#s+1] = body or ""

return table.concat(s, "\r\n")
end

实现动态请求

既然知道了wrk是如何调用request的, 那么, 我们想怎么样写报文都是可以的了, 以下是我写的一个例子, 大家可以参考一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 这里把参数进行了随机化处理
request = function()
local path = "/comments"
local start = math.random(1, 30000)
local amount = math.random(10, 30)
local body = "url=xxx1"
.. string.format("&start=%d", start)
.. string.format("&amount=%d", amount)
.. string.format("&parm=%d", xx)

local headers = {}
headers["Content-Type"] = "application/x-www-form-urlencoded"
return wrk.format('POST', path, headers, body)
end
  • 用法就和原来post脚本的调用方式一样.
1
2
3
4
./wrk -t4 -c2000 -d30s \
--latency -T5s \
-s scripts/post.lua \
http://127.0.0.1:8888/comments

PS

wrk是一个使用epoll实现的简单的小软件. 我好像不止和一个同学说过, 想看IO复用可以 读读wrk的代码, 还可以与面试官吹水聊天呢.

Lua是一个简单的脚本语言, 可以嵌入到C语言的程序中, 学一点`Lua也不是坏事, 你还可以顺便了解一下OpenResty, 作为后端的话, 它对你真的很有帮助.