Vegeta HTTP稳定压力测试工具

Posted 开源测试联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vegeta HTTP稳定压力测试工具相关的知识,希望对你有一定的参考价值。

  1. Vegeta介绍

什么是 Vegeta

Vegeta 是一个用 Go 语言编写的多功能的 HTTP 负载测试工具,它提供了命令行工具和一个开发库。

https://github.com/tsenart/vegeta/releases/download/v8.0.0/vegeta-8.0.0-linux-amd64.tar.gz


# 下载

wget https://github.com/tsenart/vegeta/releases/download/v8.0.0/vegeta-8.0.0-linux-amd64.tar.gz


# 解压

tar zxvf vegeta-8.0.0-linux-amd64.tar.gz 


# 写target.txt 文件 内容如下: 

GET https://www.baidu.com


# 测试

./vegeta attack -targets="target.txt" -rate=100 -duration=30s > res.bin


# 分析测试结果

vegeta report -inputs=res.bin -reporter=json > res.json


#查看json



# 分析请求时间

cat res.bin | ./vegeta report -reporter='hist[0,40ms,100ms,200ms,600ms,1000ms,2000ms]'


#分析结果生成html

cat res.bin | ./vegeta report -reporter=plot > plot.html


上面的仅仅是参考, 如果实际 要参考github 

https://github.com/tsenart/vegeta



常用的用法

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

dump的用法

$ vegeta dump -hUsage 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 mainimport (  "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 descriptors2560$ ulimit -u # processes / threads709

分布式攻击

如果被文件描述符限制或是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命令将会读取每个文件并且按照时间排序生成最终的报告

其它相关

如果你觉得命令行下使用 Vegeta 比较复杂的话,你还可以使用 Alex 项目。Alex 是一个基于 Vegeta Library 和 Boom 封装的压力测试 Web UI,Vegeta 提供稳定的 QPS 压力源,Boom 提供稳定的并发数压力源。


以上是关于Vegeta HTTP稳定压力测试工具的主要内容,如果未能解决你的问题,请参考以下文章

POST Api 的 Vegeta 负载测试

负载测试压力测试强度测试稳定性测试

LTP--linux稳定性测试 linux性能测试 ltp压力测试 ltp-pan

内存压力测试多久算过

[转贴]LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project

微软压力测试工具 web application stress