使用 wrk 对 http 接口进行压测并 计算其 TPS

这篇具有很好参考价值的文章主要介绍了使用 wrk 对 http 接口进行压测并 计算其 TPS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

wrk怎么看接口成功与否,互联网,程序员,it,http,网络协议,网络,面试,程序人生,功能测试,测试工具wrk怎么看接口成功与否,互联网,程序员,it,http,网络协议,网络,面试,程序人生,功能测试,测试工具

背景: wrk 是当今最流行的 HTTP 压测工具,用于模拟高并发情况下的 HTTP 请求。wrk 使用 Lua 作为脚本语言,可以通过编写 Lua 脚本来自定义请求的参数和逻辑。它支持多线程并发请求,并提供了丰富的统计信息和报告,可以帮助你评估服务器的性能和承受能力。本贴致力于最快速让你上手wrk。看完本贴,你将学会使用 wrk 对 http 接口进行压测, 并计算其 TPS 指标

安装 wrk(需要在 linux 系统上)

命令行输入一下命令下载 wrk 源码

git clone https://github.com/wg/wrk.git

随后进入 wrk 目录并进行编译

cd wrk 
make

随后将生成一个可执行的 wrk 文件,我们可以把这个文件拷贝到我想要的地方,或者直接拷贝到 bin 目录:

cp wrk /usr/local/bin/

新建工程

创建新目录 wrk_demo 在该目录下打开命令行输入:

go mod init wrk 
go mod tidy

随后创建各目录与文件如下:

-- wrk_demo 
    -- main.go http 服务端启动文件
    -- tps.lua wrk 请求参数与结果统计脚本
    -- wrk wrk 可执行文件, 由 git 仓库 make 而来
    -- go.mod --go.sum

main.go

先来看 服务端 代码, 非常简单,注册了 个 hello 路由, 然后简单校验了下 请求方法, header, 和 body 内容, 若没问题则返回一个 "hello from hello handler" 字符串。

package main

import (
   "fmt"
   "io"
   "net/http"
)

func main() {

   http.HandleFunc("/hello", helloHandler)

   errChan := make(chan error)
   go func() {
      errChan <- http.ListenAndServe(":9000", nil)
   }()
   err := <-errChan
   if err != nil {
      fmt.Println("Server stop running.")
   }
}

func helloHandler(w http.ResponseWriter, r *http.Request) {

   // check method
   if r.Method != http.MethodPost {
      w.Write([]byte("{"msg":"method error"}"))
      return
   }

   // check header
   if r.Header.Get("user_token") != "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOjEsIlVzZXJuYW1lIjoiVG9tIiwiR3JhbnRTY29wZSI6InJlYWRfdXNlcl9pbmZvIiwiaXNzIjoiQXV0aF9TZXJ2ZXIiLCJzdWIiOiJUb20iLCJhdWQiOlsiQW5kcm9pZF9BUFAiLCJJT1NfQVBQIl0sImV4cCI6MTY4MDk1MDQ4OSwibmJmIjoxNjgwOTQ2ODkwLCJpYXQiOjE2ODA5NDY4ODksImp0aSI6IkR6ZzlNZ1NlUFIifQ.7Yi42Ur2Yivh5dpmMY-CxpQ5kR0IoIAh7F8xNLjdAcM" {
      w.Write([]byte("{"msg":"userToken error"}"))
      return
   }

   // check body
   body_bytes, err := io.ReadAll(r.Body)
   if err != nil {
      w.Write([]byte("{"msg":"read body error"}"))
      return
   }

   if string(body_bytes) != "{"username":"Tom"}" {
      w.Write([]byte("{"msg":"body content error"}"))
      return
   }

   // return ok
   w.Write([]byte("{"msg":"hello from hello handler"}"))
   return

}

tps.lua

在 lua 脚本中我们定义了请求的各种参数, 使用 wrk.method, wrk.body, wrk.headers 可以很轻易的设置请求方法, 请求体和请求参数。

在 WRK中,我们是可以设置发起请求的线程数的,要统计 TPS, 就得 统计每一个线程收到的 成功返回的数量,然后将全部线程的成功返回数量相加,再除以总的响应时间, 就是TPS。

在 wrk 中可以通过 setup 函数对每一个线程设置一些初始变量,比如我定义了一个 success_counter 用于统计成功的返回数, 初始化为0. 随后将这个 success_counter 注册到了 这个 线程中,使用一个全局变量 threads 用于存储所有 线程(实际上只关注线程里面的 success_counter)

在 wrk 中还可以通过 response 函数对每个 thread 的每一个请求的 response 进行获取,比如我根据 body 是否等于某个值来判断是否返回成功的结果, 若成功返回则进行 success_counter+1. 事实上 setup 函数与 response 函数是 同一个 thread 里面的, 所以 这个 success_counter 变量可以跨函数共享, 所以在 response 函数中+1, 整个 thread 中的 thread 变量也会+1. 并且 thread.set 操作的值是一个 指针, 所以 无需再次调用 thread:set("success_counter", success_counter)即可完成 对 thread 对象的赋值操作。

在所有请求结束以后, wrk 会调用 done 函数获取到运行的结果。这里我们遍历了所有 threads, 将里面成功的返回相加再除以总的响应时间, 即为接口的TPS。由于 summary.duration是微妙, 所以计算时需要乘以 1000*1000.

wrk.method = "POST"
wrk.body = '{"username":"Tom"}'
wrk.headers["user_token"] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOjEsIlVzZXJuYW1lIjoiVG9tIiwiR3JhbnRTY29wZSI6InJlYWRfdXNlcl9pbmZvIiwiaXNzIjoiQXV0aF9TZXJ2ZXIiLCJzdWIiOiJUb20iLCJhdWQiOlsiQW5kcm9pZF9BUFAiLCJJT1NfQVBQIl0sImV4cCI6MTY4MDk1MDQ4OSwibmJmIjoxNjgwOTQ2ODkwLCJpYXQiOjE2ODA5NDY4ODksImp0aSI6IkR6ZzlNZ1NlUFIifQ.7Yi42Ur2Yivh5dpmMY-CxpQ5kR0IoIAh7F8xNLjdAcM"

-- thread table
local threads = {}

-- set up some variable for each thread
function setup(thread)
   success_counter=0
   thread:set("success_counter", success_counter)
   table.insert(threads, thread)
end

-- record successful response
function response(status, headers, body)
    if body == "{"msg":"hello from hello handler"}" then
        success_counter = success_counter + 1
    end
end

-- calculate tps
function done(summary, latency, requests)
    --sum up successful response from each thread
    total_success_counter = 0
    for _, thread in ipairs(threads) do
          total_success_counter = total_success_counter +thread:get("success_counter")
    end
    print("total_success_counter = " .. total_success_counter )
    print("TPS = "  ..     1000*1000*total_success_counter/summary.duration)
end

此外 wrk 还内置别的函数 如 init, request, delay, 这些都可以对每一个线程, 每一个请求做出更加细致的操作,有兴趣的同学可以自行查找如何使用。

运行起来

首先我们启动服务端, 确保在 wrk_demo 目录下运行

go run main.go

随后启动 wkr:

./wrk -t 2 -c 4 -d 1s -s tps.lua http://localhost:9000/hello

-t 2参数表示使用 2 个线程, -c 4参数 表示总的并发连接数为4, 每一个 线程连接数 = 总的并发连接/线程数量, -d 1s 表示请求1秒, -s tps.lua 表示请求 1秒, 最后的 http://localhost:9000/hello 为 请求的 URL

运行结果如下:

  2 threads and 4 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   169.17us   64.88us   1.04ms   81.37%
    Req/Sec    10.65k   689.25    12.12k    70.00%
  21167 requests in 1.01s, 3.05MB read
Requests/sec:  20975.47
Transfer/sec:      3.02MB
total_success_counter = 21167
TPS = 20975.472956435

可以看到 启动了 2给线程,4个并发, 每个 线程的平均延迟时间为 169.17us, 平均每秒请求数为10.65k, 还可以看到这两个指标的最大值, 标准差和正负标准差之间的比例。 总共在 1.01 秒内完成了 21167 次请求, 收到了服务端3.02MB的返回数据。 平均每秒请求数为 20975.47, 每秒收到的服务端数据为 3.02MB(也称吞吐量)。总的成功返回数为 21167, TPS 为 20975.472956435。

巨人的肩膀

  1. github.com/wg/wrk
  2. q474818917.github.io/2017/05/17/…

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

wrk怎么看接口成功与否,互联网,程序员,it,http,网络协议,网络,面试,程序人生,功能测试,测试工具

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

wrk怎么看接口成功与否,互联网,程序员,it,http,网络协议,网络,面试,程序人生,功能测试,测试工具文章来源地址https://www.toymoban.com/news/detail-775434.html

这些都在我的软件测试学习交流群里:902061117 自取

到了这里,关于使用 wrk 对 http 接口进行压测并 计算其 TPS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Jemeter对HTTP接口压测

    我们不应该仅仅局限于某一种工具,性能测试能使用的工具非常多,选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验,也算略有小成,任何性能测试(如压力测试、负载测试、疲劳强度测试等)都可以使用该工具。但我并不鼓励这样做,我们应

    2024年02月11日
    浏览(39)
  • 性能测试之使用Jemeter对HTTP接口压测

    我们不应该仅仅局限于某一种工具,性能测试能使用的工具非常多,选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验,也算略有小成,任何性能测试(如压力测试、负载测试、疲劳强度测试等)都可以使用该工具。但我并不鼓励这样做,我们应

    2024年02月07日
    浏览(45)
  • 教程:使用Jmeter对带token的接口进行压测

    最近在研究并发,用到了Jmeter对接口进行压力测试,记录下使用过程 一. 配置/bin下的Jmeter.properties,打开以下两项配置,一个是默认的编码,一个是默认的语言 二. 打开jmeter.bat运行,新建线程组,在线程组下新建以下内容 1. CSV数据文件设置(右键添加,在配置元件目录中)

    2023年04月09日
    浏览(61)
  • 使用ApiPost进行压力测试(单接口的一键并发压测)

    在API调试页面可进行 一键压测 操作,目前只支持但接口的并发压测。 1、输入并发数、轮次后,点击“开始压测”按钮,等待压测完成; 2、查看压测结果。 图片来源:https://baijiahao.baidu.com/s?id=1754892932902378304wfr=spiderfor=pc 1、并发结果很容易受外界因素影响ÿ

    2024年02月11日
    浏览(57)
  • Java21对虚拟线程进行http压测使用不同的GC

    JDK21默认GC是G1. JDK21除了G1外,还可以使用ZGC(Java11预览、Java15正式版),Java21在ZGC基础上继续推出了分代ZGC,目前还是试行阶段。 开启ZGC: java -XX:+UseZGC -jar myapp.jar 开启ZGC,并试用分代ZGC java -XX:+UseZGC -XX:+ZGenerational -jar myapp.jar 以下的对一个启用tomcat虚拟线程的spring boot 项目

    2024年02月05日
    浏览(49)
  • 性能压测工具 —— wrk

    一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平均响应时间:所有请求的平均响应时间 最大响应时间:所有请求中最

    2024年03月15日
    浏览(51)
  • OpenResty入门之压测篇:压测工具界的 “悍马” wrk

    在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之性能测试 篇。 性能测试是软件开发中不可或缺的一环,它可以帮助我们评估系统的性能、稳定性、可扩展性

    2024年02月08日
    浏览(38)
  • Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET 版本

    上次发布了:Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET Core 版本 今天计划准备压测一下 .NET 版本,来测试并记录一下 Taurus.MVC 框架在 .NET 版本的性能,以便后续持续优化改进。 为了方便对比,本文章的电脑环境和测试思路,尽量和上文保持一致,以便方便对

    2024年04月16日
    浏览(48)
  • Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET Core 版本

    最近的 Taurus.MVC 版本,对性能这一块有了不少优化,因此准备进行一下压测,来测试并记录一下 Taurus.MVC 框架的性能,以便后续持续优化改进。 今天先压测 .NET Core 版本,后续有时间再压测一下.NET 版本。 下面来看不同场景下的压测结果,以下测试结果会由两台电脑进行分

    2024年04月10日
    浏览(43)
  • Jmeter 对http接口压测

    Jmeter相对于Loadrunner来说,更轻,易于安装,如果对过程数据收集不多、测试场景不复杂的情况下,可以优先考虑。 Jemeter进行HTTP接口压力测试的具体使用步骤: 1、首先添加一线程组(即用户组:一个线程模拟一个用户行为,如果要模拟多个用户,则通过设置多线程来实现)

    2024年04月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包