编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Wrk - 可扩展的HTTP基准性能测试工具

wxchong 2024-10-12 12:34:48 开源技术 10 ℃ 0 评论

对于一个 HTTP 服务的开发来说,基准性能测试往往十分必要,它能够测量服务在大并发量下的响应时间、延迟和传输速率,为系统的性能估算,和接口的进一步优化,提供翔实的实验依据。Wrk,这个现代化的 HTTP 基准性能测试工具,以其简单的使用方法,和强大的可扩展性,在同类工具中备受欢迎。

简介

Wrk,是 wg 在 Github 上开源的 HTTP 基准测试工具,项目位于 https://github.com/wg/wrk,目前版本为 4.1.0。Wrk 使用 C 语言编写,结合了多线程的设计,以及可伸缩的事件提示系统,如 epoll 和 kqueue 等,可以在单个多核 CPU 上生成大量的 HTTP 请求。Wrk 还提供了基于 LuaJIT 的 Lua 脚本来进行扩展,生成更为复杂的 HTTP 请求,提供更多维度的测试数据等,大大提升了其扩展能力。

安装

Wrk 使用方便,在 Linux 上,可直接使用包管理工具安装,如在 Centos / RHEL 7 上:

yum install https://extras.getpagespeed.com/release-el7-latest.rpm
yum install wrk

也可以自行编译:

sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git 
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
sudo cp wrk /somewhere/in/your/PATH

在 Mac OS X 上,使用 Homebrew 直接安装:

brew install wrk

示例

Wrx 作为一个命令行工具,主要通过命令行参数进行配置和运行,常用的参数包括

  • -c, --connections:总连接数
  • -d, --duration:测试总时长
  • -t, --threads:使用线程数
  • -s, --script:LuaJIT 脚本
  • -H, --header:HTTP请求头
  • --latency:输出详细的延迟数据
  • --timeout:请求的超时时间

给出一个基本测试例子。对于 HTTP 服务 http://127.0.0.1:8080/index.html,运行命令:

wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

Wrk 使用 12 个线程,共 400 个 HTTP 连接,测试持续 30 秒。当测试完成后,命令行输出

Running 30s test @ http://127.0.0.1:8080/index.html
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   635.91us    0.89ms  12.92ms   93.69%
    Req/Sec    56.20k     8.07k   62.00k    86.54%
  22464657 requests in 30.00s, 17.76GB read
Requests/sec: 748868.53
Transfer/sec:    606.33MB

可以看到,wrk 输出了对于每个线程统计后得到的延迟和每秒请求数的平均值、标准差、极大值和标准差百分比。

Wrk 还提供了使用基于 LuaJIT 的 Lua 脚本进行扩展,脚本在每个线程中都有独立的运行环境,可在 wrk 运行的配置、测试运行时和结束时执行相应脚本。Wrk 提供了一个全局的 Lua 表结构,包括协议、主机、端口、请求方法、请求路径等,可以在脚本中引用,也可以进行修改配置,实现全局的请求自定义。例如,我们可以配置一个 POST 方法提交表格的测试:

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

我们还可以使用在测试运行时所提供的函数,进行请求和响应的自定义。例如,我们可以使用 request 函数进行请求的计数:

counter = 0

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

对于每个请求,把请求路径加上当前的计数,并在请求头中添加 X-Token,附带当前计数值。也可以使用 delay 函数,配置自定义的请求延时:

function delay()
   return math.random(10, 50)
end

本例中,在每次请求之前,添加 10 到 50 毫秒的随机延迟。我们还可以结合 request 和 response,实现请求的身份验证:

token = nil
path  = "/authenticate"

request = function()
   return wrk.format("GET", path)
end

response = function(status, headers, body)
   if not token and status == 200 then
      token = headers["X-Token"]
      path  = "/resource"
      wrk.headers["X-Token"] = token
   end
end

在这个例子中,路径 path 默认指向验证接口,而对于每个测试返回的相应,都在响应头添加 X-Token,进行身份验证,并把路径指向资源接口 /resource,允许访问资源。



总结

Wrk 作为一个 HTTP 基准性能测试工具,其具有优秀的性能,能够最大限度地挑战被测试服务的性能极限;同时,wrk 提供了基于 LuaJIT 的脚本扩展功能,在保证性能的基础上,提供了极为方便的扩展功能,可以通过编写脚本实现复杂的测试逻辑,使其功能更为强大,值得在实践中进行尝试使用。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表