golang灵活HTTP命令行压力测试工具插件Pewpew的使用
Pewpew - Golang灵活HTTP命令行压力测试工具
Pewpew是一个灵活的命令行HTTP压力测试工具。与其他压力测试工具不同,它可以同时测试多个目标并使用多种配置,模拟真实世界的负载并绕过缓存。
特性
- 多种测量服务器性能的模式
- 使用正则表达式定义目标URL
- 同时测试多个目标
- 无需运行时依赖,单一二进制文件
- 提供计时、数据传输、状态码等统计信息
- 可将原始数据导出为TSV和/或JSON格式
- 支持HTTP2
- 支持IPV6
- 大量命令行和/或配置文件选项(自定义头、Cookie、User-Agent、超时、忽略SSL证书、HTTP认证、Keep-Alive、DNS预取等)
安装
预编译的Windows、Mac、Linux和BSD二进制文件可在发布页面获取。
如果你想从源代码构建最新版本:安装Go 1.11+并执行go get github.com/bengadbois/pewpew
或克隆此仓库。
工作模式
Pewpew有两种独立的工作模式:压力(stress)模式和基准(benchmark)模式。
压力模式(pewpew stress
)会以服务器能响应的最快速度发送请求(受并发性限制)。这种模式通常最适合回答诸如"服务器返回1000个请求的最快速度是多少?"、“服务器是否会OOM?”、"我能让服务器返回503吗?"等与负载相关的问题。
基准模式(pewpew benchmark
)以固定速率(每秒请求数)发送请求。这种模式通常最适合回答诸如"在延迟超过1秒之前服务器能处理多少流量?"、"如果服务器流量限制为100 rps,会有任何503吗?"以及其他可测量的受控流量测试问题。
使用示例
# 向www.example.com发送50个请求
pewpew stress -n 50 www.example.com
# 在60秒内,每秒发送100个请求到www.example.com
pewpew benchmark --rps 100 --duration 60 www.example.com
# 向三个目标发送请求
pewpew stress -X POST --body '{"hello": "world"}' -n 100 -c 5 -t 2.5s -H "Accept-Encoding:gzip, Content-Type:application/json" https://www.example.com:443/path localhost 127.0.0.1/api
最后一个例子会向三个目标URL发送请求:
- 每个目标发送100个请求(总共300个)
- 每个目标同时5个并发请求(总共15个)
- 使用POST方法,body为
{"hello": "world"}
- 设置两个头:
Accept-Encoding:gzip
和Content-Type:application/json
- 每个请求超时时间为2.5秒
要查看完整的命令行选项,运行pewpew help
或pewpew help stress
。
使用正则表达式目标
Pewpew支持使用正则表达式(Perl语法)非确定性地生成目标URL。
# 生成类似http://localhost/pages/309的URL
pewpew stress -r "localhost/pages/[0-9]{1,3}"
# 生成更复杂的URL模式
pewpew stress -r "localhost/pages/[0-9]+\?cache=(true|false)(\&referrer=[0-9]{3})?"
注意:IP地址中的点必须转义,例如pewpew stress -r "http://127\.0\.0\.1:8080/api/user/[0-9]{1,3}"
使用配置文件
Pewpew支持使用配置文件来管理更复杂的配置。你可以在配置文件中定义一个或多个目标,每个目标都有自己的设置。
默认情况下,Pewpew会在当前目录中查找名为pewpew.json
或pewpew.toml
的配置文件。如果找到,可以这样运行Pewpew:
pewpew stress
示例配置文件可以在examples/
目录中找到。
Pewpew允许结合配置文件和命令行设置,以最大化灵活性。
作为Go库使用
Pewpew也可以作为Go库使用:
package main
import (
"fmt"
"os"
pewpew "github.com/bengadbois/pewpew/lib"
)
func main() {
stressCfg := pewpew.StressConfig{
Count: 1,
Concurrency: 1,
Verbose: false,
Targets: []pewpew.Target{{
URL: "https://127.0.0.1:443/home",
Options: pewpew.TargetOptions{
Timeout: "2s",
Method: "GET",
Body: `{"field": "data", "work": true}`,
},
}},
}
output := os.Stdout
stats, err := pewpew.RunStress(stressCfg, output)
if err != nil {
fmt.Printf("pewpew stress failed: %s", err.Error())
}
fmt.Printf("%+v", stats)
}
提示
如果在运行大量并发请求时收到很多"socket: too many open files"错误,可以尝试增加你的ulimit值。
更多关于golang灵活HTTP命令行压力测试工具插件Pewpew的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang灵活HTTP命令行压力测试工具插件Pewpew的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Pewpew - Go语言编写的灵活HTTP压力测试工具
Pewpew是一个用Go语言编写的HTTP命令行压力测试工具,它提供了灵活的配置选项和详细的统计报告。下面我将介绍Pewpew的主要功能和用法,并提供一些Go代码示例。
Pewpew的主要特点
- 支持HTTP/1.1和HTTP/2
- 提供详细的统计报告(延迟分布、错误率等)
- 支持多种HTTP方法(GET, POST, PUT, DELETE等)
- 可配置的并发级别和请求速率
- 支持自定义请求头和请求体
- 可以输出CSV格式的结果
安装Pewpew
go install github.com/bengadbois/pewpew@latest
基本使用示例
简单GET请求测试
pewpew -c 10 -n 100 https://example.com
这将对example.com发起100个请求,使用10个并发连接。
带POST请求的测试
pewpew -c 5 -n 50 -m POST -d '{"key":"value"}' -H "Content-Type: application/json" https://api.example.com/endpoint
Go代码集成示例
虽然Pewpew主要是命令行工具,但你也可以在Go代码中调用它:
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
// 使用pewpew进行压力测试
cmd := exec.Command("pewpew", "-c", "10", "-n", "100", "https://example.com")
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("pewpew failed: %v\n%s", err, output)
}
fmt.Println(string(output))
}
高级配置示例
使用配置文件
创建一个YAML配置文件config.yaml
:
targets:
- name: "Example API Test"
method: GET
url: "https://api.example.com/data"
headers:
Authorization: "Bearer token123"
options:
concurrency: 20
requests: 500
timeout: "5s"
然后运行:
pewpew -f config.yaml
输出CSV结果
pewpew -c 5 -n 100 -o csv https://example.com > results.csv
结果解读
Pewpew会输出详细的统计信息,包括:
- 请求总数
- 成功/失败数量
- 延迟统计(最小值、最大值、平均值、百分位数)
- 请求速率
- 错误详情
自定义开发
如果你想基于Pewpew进行二次开发,可以导入其库:
package main
import (
"fmt"
"github.com/bengadbois/pewpew/lib"
)
func main() {
config := pewpew.StressConfig{
Targets: []pewpew.Target{
{
URL: "https://example.com",
Method: "GET",
Options: pewpew.TargetOptions{
Count: 100,
Concurrency: 10,
Timeout: "2s",
},
},
},
}
results, err := pewpew.RunStress(config)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
for _, result := range results {
fmt.Printf("Target: %s\n", result.TargetURL)
fmt.Printf("Success rate: %.2f%%\n", result.SuccessRate*100)
fmt.Printf("Average latency: %v\n", result.AvgDuration)
}
}
性能调优建议
- 从低并发开始,逐步增加
- 监控服务器资源使用情况
- 注意客户端机器的资源限制
- 测试时间不要太短,至少30秒以上
- 关注错误率和延迟分布而不仅仅是平均延迟
Pewpew是一个功能强大且灵活的工具,特别适合在开发和测试环境中快速评估HTTP服务的性能。它的Go语言实现保证了良好的性能和跨平台支持。