有哪些.NET性能测试工具能媲美JMeter,如Crank的进阶使用技巧?

2026-05-23 00:191阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1029个文字,预计阅读时间需要5分钟。

目录+比较JMeter的.NET压测工具+Crank+入门篇+比较JMeter的.NET压测工具+Crank+进阶篇+认识yml+比较JMeter的.NET压测工具+Crank+进阶篇+认识bombardier+比较JMeter的.NET压测工具+Crank+进阶篇+认识

目录
  1. 堪比JMeter的.Net压测工具 - Crank 入门篇
  2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
  4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
  5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测
  6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈
  7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么
1. 前言

通过之前的学习,我们已经了解了各参数以及配置的意义,接下来的文章我们分别从bombardier以及wrk入手,进一步了解彼此之间的联系

2. 认识 bombardier

bombardier 是一个 HTTP(S) 基准测试工具。它是用 Go 编程语言编写的,并使用优秀的fastgithub.com/codesenberg/bombardier/releases/download/v1.2.5/bombardier-linux-arm64

运行:

./bombardier-linux-arm64 -c 200 -d 1s --insecure -l www.baidu.com --print r --format json

其中:

  • req1xx代表www.baidu.com --print r --format json

    1. 将输出的结果使用追加到stringBuilder上,再赋值给output
    2. 通过JObject.Parse解析指标,最后通过BenchmarksEventSource存储并输出到控制台或数据库、csv、json中

    其中

    • 请求总数 = req1xx + req2xx + req3xx + req4xx + req5xx + others
    • 成功请求数 = req2xx + req3xx
    • 失败请求数 = 请求总数 - 成功请求数

    BenchmarksEventSource.Register("bombardier/requests;http/requests", Operations.Max, Operations.Sum, "Requests", "Total number of requests", "n0"); BenchmarksEventSource.Register("bombardier/badresponses;http/requests/badresponses", Operations.Max, Operations.Sum, "Bad responses", "Non-2xx or 3xx responses", "n0"); BenchmarksEventSource.Register("bombardier/latency/mean;http/latency/mean", Operations.Max, Operations.Avg, "Mean latency (us)", "Mean latency (us)", "n0"); BenchmarksEventSource.Register("bombardier/latency/max;http/latency/max", Operations.Max, Operations.Max, "Max latency (us)", "Max latency (us)", "n0"); BenchmarksEventSource.Register("bombardier/rps/mean;http/rps/mean", Operations.Max, Operations.Sum, "Requests/sec", "Requests per second", "n0"); BenchmarksEventSource.Register("bombardier/rps/max;http/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); BenchmarksEventSource.Register("bombardier/throughput;http/throughput", Operations.Max, Operations.Sum, "Read throughput (MB/s)", "Read throughput (MB/s)", "n2"); BenchmarksEventSource.Register("bombardier/raw", Operations.All, Operations.All, "Raw results", "Raw results", "json"); var total = document["result"]["req1xx"].Value<long>() + document["result"]["req2xx"].Value<long>() + document["result"]["req3xx"].Value<long>() + document["result"]["req3xx"].Value<long>() + document["result"]["req4xx"].Value<long>() + document["result"]["req5xx"].Value<long>() + document["result"]["others"].Value<long>(); var success = document["result"]["req2xx"].Value<long>() + document["result"]["req3xx"].Value<long>(); BenchmarksEventSource.Measure("bombardier/requests;http/requests", total); BenchmarksEventSource.Measure("bombardier/badresponses;http/requests/badresponses", total - success); BenchmarksEventSource.Measure("bombardier/latency/mean;http/latency/mean", document["result"]["latency"]["mean"].Value<double>()); BenchmarksEventSource.Measure("bombardier/latency/max;http/latency/max", document["result"]["latency"]["max"].Value<double>()); BenchmarksEventSource.Measure("bombardier/rps/max;http/rps/max", document["result"]["rps"]["max"].Value<double>()); BenchmarksEventSource.Measure("bombardier/rps/mean;http/rps/mean", document["result"]["rps"]["mean"].Value<double>()); BenchmarksEventSource.Measure("bombardier/raw", output); var bytesPerSecond = document["result"]["bytesRead"].Value<long>() / document["result"]["timeTakenSeconds"].Value<double>(); // B/s to MB/s BenchmarksEventSource.Measure("bombardier/throughput", bytesPerSecond / 1024 / 1024); 4. 解读bombardier.yml各参数作用

    • connections: 最大并发连接数,默认: 256
    • warmup: 预热时间,默认15s,与执行duration类似,而并非压测次数
      • 当warmup > 0时,会先预热warmup秒后再执行一次压测,第二次的压测才是最后返回的结果
      • 当warmup = 0时,不进行预热,直接开始压测
    • duration: 测试时长,单位: s
    • requests: 请求数
    • rate: 每秒请求数限制
    • transport: 传输方式。默认: fasthttp 、支持fasthttp、http1、http2三种
    • presetHeaders: 预设header,根据全局参数headers,自选其一即可,选择json,那请求的header即为: --header "Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,/;q=0.7" --header "Connection: keep-alive"
    • customHeaders: 自定义headers,如果预设headers中没有需要的header,则通过重写customHeaders,以完成自定义header的目的
    • serverUri: 自定义url,如果此参数存在,则请求地址为: {serverUri}:{serverPort}{path}
    • serverPort: 服务端口
    • serverScheme: 服务的Scheme,默认http、支持http、https两种
    • serverAddress: 服务地址、不包含http、例如: www.baidu.com,如果serverUri存在,此配置无效,如果不存在,请求格式为: {serverScheme}

本文共计1029个文字,预计阅读时间需要5分钟。

目录+比较JMeter的.NET压测工具+Crank+入门篇+比较JMeter的.NET压测工具+Crank+进阶篇+认识yml+比较JMeter的.NET压测工具+Crank+进阶篇+认识bombardier+比较JMeter的.NET压测工具+Crank+进阶篇+认识

目录
  1. 堪比JMeter的.Net压测工具 - Crank 入门篇
  2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
  4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
  5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测
  6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈
  7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么
1. 前言

通过之前的学习,我们已经了解了各参数以及配置的意义,接下来的文章我们分别从bombardier以及wrk入手,进一步了解彼此之间的联系

2. 认识 bombardier

bombardier 是一个 HTTP(S) 基准测试工具。它是用 Go 编程语言编写的,并使用优秀的fastgithub.com/codesenberg/bombardier/releases/download/v1.2.5/bombardier-linux-arm64

运行:

./bombardier-linux-arm64 -c 200 -d 1s --insecure -l www.baidu.com --print r --format json

其中:

  • req1xx代表www.baidu.com --print r --format json

    1. 将输出的结果使用追加到stringBuilder上,再赋值给output
    2. 通过JObject.Parse解析指标,最后通过BenchmarksEventSource存储并输出到控制台或数据库、csv、json中

    其中

    • 请求总数 = req1xx + req2xx + req3xx + req4xx + req5xx + others
    • 成功请求数 = req2xx + req3xx
    • 失败请求数 = 请求总数 - 成功请求数

    BenchmarksEventSource.Register("bombardier/requests;http/requests", Operations.Max, Operations.Sum, "Requests", "Total number of requests", "n0"); BenchmarksEventSource.Register("bombardier/badresponses;http/requests/badresponses", Operations.Max, Operations.Sum, "Bad responses", "Non-2xx or 3xx responses", "n0"); BenchmarksEventSource.Register("bombardier/latency/mean;http/latency/mean", Operations.Max, Operations.Avg, "Mean latency (us)", "Mean latency (us)", "n0"); BenchmarksEventSource.Register("bombardier/latency/max;http/latency/max", Operations.Max, Operations.Max, "Max latency (us)", "Max latency (us)", "n0"); BenchmarksEventSource.Register("bombardier/rps/mean;http/rps/mean", Operations.Max, Operations.Sum, "Requests/sec", "Requests per second", "n0"); BenchmarksEventSource.Register("bombardier/rps/max;http/rps/max", Operations.Max, Operations.Sum, "Requests/sec (max)", "Max requests per second", "n0"); BenchmarksEventSource.Register("bombardier/throughput;http/throughput", Operations.Max, Operations.Sum, "Read throughput (MB/s)", "Read throughput (MB/s)", "n2"); BenchmarksEventSource.Register("bombardier/raw", Operations.All, Operations.All, "Raw results", "Raw results", "json"); var total = document["result"]["req1xx"].Value<long>() + document["result"]["req2xx"].Value<long>() + document["result"]["req3xx"].Value<long>() + document["result"]["req3xx"].Value<long>() + document["result"]["req4xx"].Value<long>() + document["result"]["req5xx"].Value<long>() + document["result"]["others"].Value<long>(); var success = document["result"]["req2xx"].Value<long>() + document["result"]["req3xx"].Value<long>(); BenchmarksEventSource.Measure("bombardier/requests;http/requests", total); BenchmarksEventSource.Measure("bombardier/badresponses;http/requests/badresponses", total - success); BenchmarksEventSource.Measure("bombardier/latency/mean;http/latency/mean", document["result"]["latency"]["mean"].Value<double>()); BenchmarksEventSource.Measure("bombardier/latency/max;http/latency/max", document["result"]["latency"]["max"].Value<double>()); BenchmarksEventSource.Measure("bombardier/rps/max;http/rps/max", document["result"]["rps"]["max"].Value<double>()); BenchmarksEventSource.Measure("bombardier/rps/mean;http/rps/mean", document["result"]["rps"]["mean"].Value<double>()); BenchmarksEventSource.Measure("bombardier/raw", output); var bytesPerSecond = document["result"]["bytesRead"].Value<long>() / document["result"]["timeTakenSeconds"].Value<double>(); // B/s to MB/s BenchmarksEventSource.Measure("bombardier/throughput", bytesPerSecond / 1024 / 1024); 4. 解读bombardier.yml各参数作用

    • connections: 最大并发连接数,默认: 256
    • warmup: 预热时间,默认15s,与执行duration类似,而并非压测次数
      • 当warmup > 0时,会先预热warmup秒后再执行一次压测,第二次的压测才是最后返回的结果
      • 当warmup = 0时,不进行预热,直接开始压测
    • duration: 测试时长,单位: s
    • requests: 请求数
    • rate: 每秒请求数限制
    • transport: 传输方式。默认: fasthttp 、支持fasthttp、http1、http2三种
    • presetHeaders: 预设header,根据全局参数headers,自选其一即可,选择json,那请求的header即为: --header "Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,/;q=0.7" --header "Connection: keep-alive"
    • customHeaders: 自定义headers,如果预设headers中没有需要的header,则通过重写customHeaders,以完成自定义header的目的
    • serverUri: 自定义url,如果此参数存在,则请求地址为: {serverUri}:{serverPort}{path}
    • serverPort: 服务端口
    • serverScheme: 服务的Scheme,默认http、支持http、https两种
    • serverAddress: 服务地址、不包含http、例如: www.baidu.com,如果serverUri存在,此配置无效,如果不存在,请求格式为: {serverScheme}