文档章节

Vegeta(高性能 HTTP 负载测试工具)

youbingchenyoubing
 youbingchenyoubing
发布于 2016/08/01 09:51
字数 2007
阅读 238
收藏 0

为什么要了解这个东西呢?主要是针对之前已经写好的程序磁盘缓存要做压力测试,我之前写的磁盘缓存采用的是类似http协议,并不是真正的http协议,所以要对这个源码进行修改,最近读了好多别人的源代码,会有点困乏,所以对如何读和修改源代码进行了解,这里有一篇别人的经验感觉还不错有效率地阅读源码以及修改源码的技巧,万事开头难,奔跑吧少年

Vegeta是什么

Vegeta 是一个用Go语言编写的多功能的 HTTP 负载测试工具,提供命令行工具和一个开发包。 下面的用法来源于官网

Usage: vegeta [global flags] <command> [command flags]
 
global flags:
  -cpus int
    	使用CUP的数量 (默认 4 个)
  -profile string
    	Enable profiling of [cpu, heap]
  -version
    	打印版本并退出
 
attack command:
  -body string
    	请求的主体文件
  -cert string
    	TLS客户PEM编码的证书文件
  -connections int
    	没个目标主机最大打开闲置链接数 (默认 10000)
  -duration duration
    	持续攻击时间 [0 = forever]
  -header value
    	请求头
  -insecure
    	忽略无效的服务器TLS证书
  -keepalive
    	使用持久链接 (default true)
  -key string
    	TLS客户端PEM编码的私钥文件
  -laddr value
    	本地IP地址 (default 0.0.0.0)
  -lazy
    	延迟懒散的读取目标
  -output string
    	输出文件 (default "stdout")
  -rate uint
    	每秒请求数 (default 50)
  -redirects int
    	遵循重定向的次数. -1 不会遵循重定向但会标记为成功 (默认 10)
  -root-certs value
    	TLS根证书文件 (逗号分隔列表)
  -targets string
    	目标文件 (default "stdin")
  -timeout duration
    	请求超时时间 (default 30s)
  -workers uint
    	初始化进程数 (default 10)
 
report command:
  -inputs string
    	输入文件 (comma separated) (default "stdin")
  -output string
    	输出文件 (default "stdout")
  -reporter string
    	表报字符格式 [text, json, plot, hist[buckets]] (default "text")
 
dump command:
  -dumper string
    	Dumper [json, csv] (default "json")
  -inputs string
    	Input files (comma separated) (default "stdin")
  -output string
    	Output file (default "stdout")
 
举例:
  echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report
  vegeta attack -targets=targets.txt > results.bin
  vegeta report -inputs=results.bin -reporter=json > metrics.json
  cat results.bin | vegeta report -reporter=plot > plot.html
  cat results.bin | vegeta report -reporter="hist[0,100ms,200ms,300ms]"

attack的用法

~/ vegeta attack -h
Usage of vegeta attack:
  -body string
    	请求主体文件 指定文件里的内容,将被设置为请求主体去攻击目标, 查看 -targets 参数.
  -cert string
    	TLS客户PEM编码的证书文件
    	指定PEM编码和TLS客户端证书文件用于HTTPS的请求。如果-key未指定,它会被设置为这个标志的值
  -connections int
    	每个目标主机最大打开闲置链接数 (default 10000)
    	指定每个目标主机打开的空闲连接的最大数目
  -duration duration
    	持续攻击时间 [0 = forever]
    	指定发送请求到目标主机需要多长时间. 内部结构的并发性的设置有这个值作为一个变量. 测试的实际运行时间可能比设定的时间要长,由于响应有延迟. 用0表示无限攻击.
  -header value
    	请求头
    	指定定义目标的请求头, 查看 -targets. 根据需要,可以重复指定多个请求标记
  -insecure
    	忽略无效的服务器TLS证书
    	指定是否忽略无效的服务器TLS证书。
  -keepalive
    	使用持久链接 (default true)
    	指定是否忽略无效的服务器TLS证书。
  -key string
    	TLS客户端PEM编码的私钥文件
    	指定要使用HTTPS请求中使用的PEM编码SSL客户端证书私钥文件。
  -laddr value
    	本地IP地址 (default 0.0.0.0)
    	指定要使用的本地IP地址。
  -lazy
    	延迟懒散的读取目标
    	指定是否懒惰,而不是急切地读取输入的目标。这使得流指标纳入攻击指令,并减少内存占用。权衡是针对每个目标命中增加延迟之一。
  -output string
    	输出文件 (default "stdout")
    	指定的输出文件结果将被写入二进制. 使用管道将报告命令输入. 默认为标准输出
  -rate uint
    	每秒请求数 (default 50)
    	指定每秒钟对目标发送请求的速率,实际的请求率可能因为喜欢搜集的垃圾稍微有不同, 但总体来说它应该保持非常接近指定的速率.
  -redirects int
    	遵循重定向的次数. -1 不会遵循重定向但会标记为成功 (默认 10)
    	指定每个请求的重定向的最大次数. 默认为 10 次. 当值为 -1, 重定向不会遵循但响应标记为成功.
  -root-certs value
    	TLS根证书文件 (逗号分隔列表)
    	指定可信的TLS 根CAs 证书文件,可用逗号分隔列表. 如果未指定,系统默认的CA证书将被使用。
  -targets string
    	目标文件 (default "stdin")
  -timeout duration
    	请求超时时间 (default 30s)
    	指定每个请求的超时时间. 默认值为0,禁止超时.
  -workers uint
    	初始化进程数 (default 10)
    	指定在攻击中使用进程的初始化数量. 进程的实际数量将为了维持所要求的速率,如果有必要可以增加。

report的用法

$ vegeta report -h
Usage of vegeta report:
  -inputs string
      输入文件 (comma separated) (默认 "stdin")
      指定输入文件生成的报告,默认为标准输入. 这些都是 vegeta 攻击的输出内容. 你可以指定多个输出(逗号分隔),它将正在把这些报告进行合并和分类.
  -output string
      输出文件 (default "stdout")
      指定该报告输出的文件
  -reporter string
      报告格式 [text, json, plot, hist[buckets]] (默认 "text")
      指定要生成的报告类型. 默认为 文本.

dump的用法

$ vegeta dump -h
Usage of vegeta dump:
  -dumper string
      Dumper [json, csv] (default "json")
      指定转储格式
  -inputs string
      Input files (comma separated) (default "stdin")
      指定要转储含有攻击结果的输入文件. 你可以指定多个 (逗号分隔).
  -output string
      Output file (default "stdout")
      指定把转储文件写入到输出文件中.

Usage:Distributed attacks(分布式攻击)

当进行负载测试时,不能因Vegeta自身机器的性能瓶颈限制无法达到预期结果,例如打开的文件数,内存大小, CPU 和 网络带宽, 分布式的使用Vegeta是非常好的想法。

<strong>确保 打开文件描述 和 进程限制设置得高一些,你可以在你的机器上使用 ulimit 命令</strong>

我们已准备好开始攻击(压力测试). 我们需要做的是在每个机器上执行设定的攻击速率和攻击数量,在这里我们使用 pdsh 进行并行执行.

 pdsh -b -w '10.0.1.1,10.0.2.1,10.0.3.1' \
    'echo "GET http://target/" | vegeta attack -rate=20000 -duration=60s > result.bin'

前面的命令完成后,就可以将收集到的结果文件在我们的报表中使用

 for machine in "10.0.1.1 10.0.2.1 10.0.3.1"; do
    scp $machine:~/result.bin $machine.bin &
  done

Usage (Library)

package main

import (
  "fmt"
  "time"

  vegeta "github.com/tsenart/vegeta/lib"
)

func main() {
  rate := uint64(100) // per second
  duration := 4 * time.Second
  targeter := vegeta.NewStaticTargeter(vegeta.Target{
    Method: "GET",
    URL:    "http://localhost:9100/",
  })
  attacker := vegeta.NewAttacker()

  var metrics vegeta.Metrics
  for res := range attacker.Attack(targeter, rate, duration) {
    metrics.Add(res)
  }
  metrics.Close()

  fmt.Printf("99th percentile: %s\n", metrics.Latencies.P99)
}
$ ulimit -n # file descriptors
2560
$ ulimit -u # processes / threads
709

分布式攻击

如果被文件描述符限制或是CPU,内存限制,我们可以采用分布式攻击,假设一个场景:我们攻击的频率是每秒60千次。我们假设我们在三台计算机上安装了vegeta程序。同时确认文件描述符和进程限制都必须设置为高数字。

做好攻击准备,我们必须分割攻击频率到每一台机器上,我们使用了pdsh来实现这个流程

pdsh -b -w '10.0.1.1,10.0.2.1,10.0.3.1' \
    'echo "GET http://target/" | vegeta attack -rate=20000 -duration=60s > result.bin'

上面命令执行完毕,我们要在每一台电脑拷贝他们的结果

for machine in "10.0.1.1 10.0.2.1 10.0.3.1"; do
    scp $machine:~/result.bin $machine.bin &
  done

最后使用一个report命令处理多个以逗号隔开的结果文件列表,report命令将会读取每个文件并且按照时间排序生成最终的报告 。

© 著作权归作者所有

youbingchenyoubing
粉丝 0
博文 7
码字总数 10626
作品 0
厦门
私信 提问
Vegeta 6.1.0 发布,增加对 HTTP/2 的支持

Vegeta 6.1.0 发布了,该版本最值得关注的是支持 HTTP/2 的测试,可通过命令行参数 -http2 来启用。 下载地址:https://github.com/tsenart/vegeta/releases/tag/v6.1.0 Vegeta 是一个万能的...

oschina
2016/04/06
2.1K
1
Http服务压力测试工具Alex(自带Web UI)

Alex Alex是基于vegeta library和boom封装的压力测试web UI。Vegeta提供稳定的qps压力源,boom提供稳定的并发数压力源。github地址 https://github.com/ireaderlab/alex English Alex架构图 ...

shellquery
2016/05/19
1K
3
使用 AMQP 和 Vert.x 实现微服务间的异步通信

微服务是大多数新型现代软件解决方案中的首选架构。它们(大多数)被设计成去做一件事,它们必须相互协作去完成业务用例。微服务之间的所有通信都是通过网络呼叫进行的;这种模式避免了服务之...

oschina
2018/08/31
912
2
使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果。 PS:Wrk 并不能针对测试的结果生...

myzony
2018/10/16
0
0
gatling系列教程(翻译)-第一节

gatling是一款高性能的负载测试工具。 它的设计易于使用,可维护性和高性能。 开箱即用,Gatling对HTTP协议提供极好的支持,使其成为负载测试任何HTTP服务器的首选工具。 由于核心引擎实际上...

nifork
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用kubeadm 搭建K8s集群

1. 参考官网 https://kubernetes.io/docs/setup/independent/install-kubeadm/

whhbb
34分钟前
2
0
Dubbo 3.0 !提升不止一点点!

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。 自去年 12 月开始,Dubbo 3.0 便已正...

编程SHA
35分钟前
2
0
提升不止一点点,Dubbo 3.0 预览版详细解读

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。更多用户信息,可以访问Dubbo @GitHub...

阿里云云栖社区
39分钟前
22
0
HanLP Analysis for Elasticsearch

基于 HanLP 的 Elasticsearch 中文分词插件,核心功能: 兼容 ES 5.x-7.x; 内置词典,无需额外配置即可使用; 支持用户自定义词典; 支持远程词典热更新(待开发); 内置多种分词模式,适合...

左手的倒影
今天
1
0
spark部署之yarn模式

spark部署之yarn模式 hadoop-3.0.0集群搭建 配置相应环境 java环境 scala(可配可不配) hadoop环境 从官网下载spark 解压 配置 /conf/spark-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_4...

jackmanwu
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部