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