Vegeta HTTP稳定压力测试工具
Posted 开源测试联盟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vegeta HTTP稳定压力测试工具相关的知识,希望对你有一定的参考价值。
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稳定压力测试工具的主要内容,如果未能解决你的问题,请参考以下文章
LTP--linux稳定性测试 linux性能测试 ltp压力测试 ltp-pan
[转贴]LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project