Vegeta高性能 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命令将会读取每个文件并且按照时间排序生成最终的报告

原创文章,作者:赛福,如若转载,请注明出处:https://www.safecdn.cn/644.html

本站不销售、不代购、不提供任何支持,仅分享网络信息,请自行辨别,请遵纪守法、文明上网。