您的位置:

深入浅出 wrk 压测工具

在进行任何 Web 应用程序开发之前,都需要对其进行压力测试。如果在生产环境中出现负载过高或响应速度缓慢,那么可能会导致用户的不满或应用程序的崩溃。此时,可以使用 wrk 工具对应用程序进行压力测试以获取它的性能数据。本文将深入浅出地介绍 wrk 工具。

一、wrk 压测工具

wrk 是一个高性能的 HTTP 压力测试工具。它使用 C 语言编写,可以模拟大量用户同时访问 Web 应用程序,并提供关于应用程序在高负载下的性能数据。 wrk 通过 OpenResty 中的 LuaJIT 引擎实现的高效 IO 多路复用(epoll 或 kqueue),可以同时发起多个 HTTP 请求,模拟真实的负载,从而检查服务器的性能和响应能力,包括请求的速度、错误的数量和服务器的吞吐量等指标。

wrk 有以下优点:

1.高性能、低消耗:处理多线程,使用了基于 I/O 多路复用的高效机制,可以充分发挥性能;

2.支持多种参数设置,支持自定义请求方式和请求头;

3.简单易用,支持自定义报告输出格式。

二、wrk 压测有 timeout 怎么处理

在 wrk 压力测试中,当一个请求没有在一定的时间内得到响应时,它就会超时并放弃对服务器的请求。因此,处理 timeout 是必须的。wrk 可以使用以下参数设置 timeout:

--timeout             Socket/request timeout in ms (default: 2000)

  

以上命令行选项将请求的超时时间设置为 2 秒。如果超时时间过长,则会造成资源浪费和不准确的测试结果。

三、wrk 压测报错

在使用 wrk 进行压力测试时,可能会遇到以下报错信息:

  • ERROR: Connect timed out
  • WARN: Response timeout for
  • ERROR: Failed to read response
  • ERROR: Connection reset by peer
  • 等等...

这些报错信息通常表示服务器响应速度慢、网络传输出现问题或者服务器存在配置问题等。解决方法如下:

  • 尝试使用 -H 参数设置合适的请求头;
  • 检查服务器是否出于高负载状态或是否存在其他应用程序导致了计算机的高负载情况;
  • 优化 / 调整服务器网络配置、操作系统和应用程序配置。

四、wrk 压测比别的工具高

wrk 和很多其他压测工具相比,具有很多优点:

  • wrk 支持 HTTP 和 HTTPS 协议;
  • wrk 并非仅仅做测量,而是在并发中工作,模拟真实的请求;
  • 相比 Jmeter 和 ApacheBench,wrk 消耗更少的资源,可轻松模拟大量并发请求;
  • wrk 是基于 LuaJIT 和 OpenResty 构建的,可以使用并发性更好和更稳定的 CIO 处理请求;
  • wrk 可以配置要测试的 URL 数组和相应的权重,然后通过这些 URL 和特定权重的组合向服务器发送请求。

五、wrk 压测 TPS 新建 并发 吞吐

wrk 有三个主要的关键指标:TPS、并发和吞吐量,将它们简单归纳如下:

  • TPS(每秒事务数):每秒钟服务器能够处理的请求数;
  • 并发(Concurrence):模拟使用的并发用户数量
  • 吞吐量(Transfer rate):系统在运行时的总体繁忙程度

使用以下参数可以获取 TPS、并发和吞吐量数值等信息:

wrk -c 1000 -t 10 -d 60s http://localhost:8000

以上命令将在 10 个线程、1000 并发连接和 60 秒的时间内模拟对 http://localhost:8000 的请求。指定具体的 TPS 参数和其他输出格式可以使用 wrk 的第三方脚本,例如 wrk2report.py 等。

六、wrk 压测时候 qps 一直上不去

当 wrk 的测试结果中 qps 值非常低或出现 qps 持续低于该默认值时,可能有以下原因:

  • 模拟的用户数量太少,需要增加一些线程以增加并发数;
  • 服务器端的配置不能满足测试需求,需要检查并更改;
  • 应用程序没有足够的数据源或者没有合适的数据源,需要增加或修改测试数据;
  • wrk 的操作有误,需要适当修改它的参数。

针对以上问题,可以增加线程数量、检查并更改服务器端配置、增加或修改测试数据、修改 wrk 的参数。

总结

wrk 是一个高效的 HTTP 压力测试工具,支持多种自定义参数设置,测试结果准确,可以测量 TPS、并发、吞吐量等最为关键的指标。在使用该工具时,需要根据具体情况设置参数,处理 timeout、错误等问题,并及时优化测试结果,才能为生产环境中的应用程序提供强大的性能保障和优化手段。