一个HTTP压力测试软件 许多用法从wrk
的Github主页 上即可看到.
安装的话, 参考这里就可以: Wrk安装方式 .
官方的介绍的POST请求 下面是一个官方给出的例子, 只是实现了POST方法, 但是其实是可以有一些扩展的.
1 2 3 4 5 6 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
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 , 作为后端的话, 它对你真的很有帮助.