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:gzipContent-Type:application/json
  • 每个请求超时时间为2.5秒

要查看完整的命令行选项,运行pewpew helppewpew 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.jsonpewpew.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

1 回复

更多关于golang灵活HTTP命令行压力测试工具插件Pewpew的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Pewpew - Go语言编写的灵活HTTP压力测试工具

Pewpew是一个用Go语言编写的HTTP命令行压力测试工具,它提供了灵活的配置选项和详细的统计报告。下面我将介绍Pewpew的主要功能和用法,并提供一些Go代码示例。

Pewpew的主要特点

  1. 支持HTTP/1.1和HTTP/2
  2. 提供详细的统计报告(延迟分布、错误率等)
  3. 支持多种HTTP方法(GET, POST, PUT, DELETE等)
  4. 可配置的并发级别和请求速率
  5. 支持自定义请求头和请求体
  6. 可以输出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)
	}
}

性能调优建议

  1. 从低并发开始,逐步增加
  2. 监控服务器资源使用情况
  3. 注意客户端机器的资源限制
  4. 测试时间不要太短,至少30秒以上
  5. 关注错误率和延迟分布而不仅仅是平均延迟

Pewpew是一个功能强大且灵活的工具,特别适合在开发和测试环境中快速评估HTTP服务的性能。它的Go语言实现保证了良好的性能和跨平台支持。

回到顶部