HTTP Bench - 强大的 HTTP 压力测试工具

July 25, 2026 · View on GitHub

build build build build

HTTP Bench 是一个轻量级、高性能的压力测试工具,支持多种协议和分布式测试能力。

English Document
中文文档
使用样例

功能特点

  • 多协议支持:HTTP/1、HTTP/2、HTTP/3、WebSocket
  • 全局 QPS 限速-q 由所有并发 worker 共享,不会随并发数平方放大
  • duration 优先语义:同时设置 -n-d 时,-d 优先 — 测试运行完整时长
  • 分布式测试:跨多台机器运行测试,实现更高负载
  • 模板函数:使用内置函数和变量动态生成请求
  • Web 仪表盘:通过浏览器界面监控和控制测试
  • 全面的指标:详细的性能统计和延迟分布
  • 灵活配置:丰富的命令行选项,可自定义测试场景

仪表盘演示

安装

要求:Go 版本 1.20 或更高

方式一:使用 Go Get

go get github.com/linkxzhou/http_bench

方式二:从源码构建

git clone git@github.com:linkxzhou/http_bench.git
cd http_bench
go build .

架构

以下图表说明了 HTTP Bench 的架构:

架构图

基本用法

运行一个简单的压力测试,使用 1000 个并发连接持续 60 秒:

./http_bench http://127.0.0.1:8000 -c 1000 -d 60s

输出示例:

Running 1000 connections, @ http://127.0.0.1:8000

Summary:
  Total:        63.031 secs
  Slowest:      0.640 secs
  Fastest:      0.000 secs
  Average:      0.072 secs
  Requests/sec: 12132.423
  Total data:   8.237 GB
  Size/request: 11566 bytes

Status code distribution:
  [200] 764713 responses

Latency distribution:
  10% in 0.014 secs
  25% in 0.030 secs
  50% in 0.060 secs
  75% in 0.097 secs
  90% in 0.149 secs
  95% in 0.181 secs
  99% in 0.262 secs

命令行选项

-n  请求 HTTP 的次数
-c  并发的客户端数量(不能大于 HTTP 的请求次数)
-q  频率限制,每秒的请求数 (QPS)
-d  压测持续时间(例如:2s, 2m, 2h)
-t  请求超时时间(duration 字符串,如 500ms、2s)
-o  输出类型(summary、csv、html;默认 summary)
-m  HTTP 方法(GET, POST, PUT, DELETE, HEAD, OPTIONS)
-H  自定义 HTTP 头部(例如:-H "Accept: text/html" -H "Content-Type: application/xml")
-http  支持 http1, http2, http3, ws, wss,默认 http1
-body  HTTP 请求体,默认为空
-a  HTTP 基本认证,格式:username:password
-x  HTTP 代理地址,格式:host:port
-disable-compression  禁用压缩
-disable-keepalive    禁用 keep-alive,防止在不同 HTTP 请求之间重用 TCP 连接
-cpus     使用的 CPU 核心数(默认为当前机器的核心数)
-url      请求单个 URL
-verbose  日志级别:0=TRACE、1=DEBUG、2=INFO、3=WARN、4=ERROR(默认 3)
-insecure  跳过 TLS 证书校验(默认 true;生产环境建议使用 -insecure=false)
-file     从 .http 文件读取请求(支持多请求)
-listen   监听 IP:PORT 用于分布式压测 Worker 或 Dashboard(默认为空)。例如:"127.0.0.1:12710";controller 结果包含每个 worker 的成功/失败明细
-W  运行分布式压测的工作机器列表
      例如:-W "127.0.0.1:12710" -W "127.0.0.1:12711"
-example  打印压测示例(默认为 false)

重构说明

详细模块布局、关键接口契约、性能基线与长压测脚本见 docs/REFACTOR_NOTES.md

使用示例

使用样例

单 URL 测试

# 基本 GET 请求,1000 次请求,10 个并发连接
./http_bench -n 1000 -c 10 -m GET -url "http://127.0.0.1/test1"
./http_bench -n 1000 -c 10 -m GET "http://127.0.0.1/test1"

从文件测试 URL 列表

# 从 .http 文件读取请求进行压测
./http_bench -n 1000 -c 10 -file requests.http

# 结合其他参数(如持续时间)使用
./http_bench -d 10s -c 10 -file requests.http

HTTP/2 测试

./http_bench -d 10s -c 10 -http http2 -m POST "http://127.0.0.1/test1" -body "{}"

HTTP/3 测试

./http_bench -d 10s -c 10 -http http3 -m POST "http://127.0.0.1/test1" -body "{}"

WebSocket 测试

./http_bench -d 10s -c 10 -http ws "ws://127.0.0.1" -body "{}"

分布式压力测试

# 步骤 1:在不同机器上启动工作实例
./http_bench -listen "127.0.0.1:12710" -verbose 1
./http_bench -listen "127.0.0.1:12711" -verbose 1

# 步骤 2:运行控制器协调测试
./http_bench -c 1 -d 10s "http://127.0.0.1:18090/test1" -body "{}" -W "127.0.0.1:12710" -W "127.0.0.1:12711" -verbose 1

Web 仪表盘

# 步骤 1:启动仪表盘服务器
./http_bench -listen "127.0.0.1:12345" -verbose 1

# 步骤 2:在浏览器中打开仪表盘 URL
# http://127.0.0.1:12345

仪表盘在 worker 节点上异步执行压测,并通过 /api 接口轮询实时指标,提供:

  • 实时 QPS 与各状态码曲线,刷新间隔可调(默认 2000 毫秒)
  • 概览卡片:平均耗时、平均 QPS、最快/最慢耗时、错误总数
  • 响应耗时分布直方图与错误分布饼图
  • 一键开始/停止,压测结束时自动渲染最后一帧数据
  • 中英文界面切换

模板函数和变量

HTTP Bench 支持使用模板函数动态生成请求。这些函数可以在 URL 参数和请求体中使用。

1. 整数求和

计算多个整数的和。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ intSum 1 2 3 4}}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ intSum 1 2 3 4 }}" -verbose 0

2. 随机整数

生成介于最小值和最大值之间的随机整数。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ random 1 100000}}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ random 1 100000 }}" -verbose 0

3. 随机日期

生成指定格式的随机日期字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomDate 'YMD' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomDate 'YMD' }}" -verbose 0

4. 随机字符串

生成指定长度的随机字母数字字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomString 10}}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomString 10 }}" -verbose 0

5. 随机数字字符串

生成指定长度的随机数字字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomNum 10}}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomNum 10 }}" -verbose 0

6. 当前日期

输出指定格式的当前日期。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ date 'YMD' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ date 'YMD' }}" -verbose 0

7. UUID

生成 UUID。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ UUID | escape }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ UUID }}" -verbose 0

8. 字符串转义

转义字符串中的特殊字符。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ UUID | escape }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ UUID | escape }}" -verbose 0

9. 十六进制转字符串

将十六进制字符串转换为普通字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ hexToString '68656c6c6f20776f726c64' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ hexToString '68656c6c6f20776f726c64' }}" -verbose 0

10. 字符串转十六进制

将字符串转换为其十六进制表示。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ stringToHex 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ stringToHex 'hello world' }}" -verbose 0

11. 转为字符串

将值转换为带引号的字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomNum 10 | toString }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomNum 10 | toString }}" -verbose 0

12. Base64 编码

将字符串编码为 Base64 格式。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ base64Encode 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ base64Encode 'hello world' }}" -verbose 0

13. Base64 解码

解码 Base64 编码的字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ base64Decode 'aGVsbG8gd29ybGQ=' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ base64Decode 'aGVsbG8gd29ybGQ=' }}" -verbose 0

14. MD5 哈希

生成字符串的 MD5 哈希值。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ md5 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ md5 'hello world' }}" -verbose 0

15. SHA1 哈希

生成字符串的 SHA1 哈希值。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ sha1 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ sha1 'hello world' }}" -verbose 0

16. SHA256 哈希

生成字符串的 SHA256 哈希值。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ sha256 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ sha256 'hello world' }}" -verbose 0

17. HMAC 签名

使用指定的哈希算法生成 HMAC 签名。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ hmac 'secret_key' 'message' 'sha256' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ hmac 'secret_key' 'message' 'sha256' }}" -verbose 0

18. 随机 IP 地址

生成随机的 IP 地址。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomIP }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomIP }}" -verbose 0

19. 字符串截取

从字符串中提取子字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ substring 'hello world' 0 5 }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ substring 'hello world' 0 5 }}" -verbose 0

20. 字符串替换

将字符串中所有出现的子字符串替换为另一个字符串。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ replace 'hello world' 'world' 'golang' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ replace 'hello world' 'world' 'golang' }}" -verbose 0

21. 转为大写

将字符串转换为大写。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ upper 'hello world' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ upper 'hello world' }}" -verbose 0

22. 转为小写

将字符串转换为小写。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ lower 'HELLO WORLD' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ lower 'HELLO WORLD' }}" -verbose 0

23. 去除空格

去除字符串首尾的空白字符。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ trim '  hello world  ' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ trim '  hello world  ' }}" -verbose 0

24. 随机选择

从多个选项中随机选择一个。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomChoice 'apple' 'banana' 'cherry' }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomChoice 'apple' 'banana' 'cherry' }}" -verbose 0

25. 随机浮点数

生成介于最小值和最大值之间的随机浮点数。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomFloat 1.5 10.5 }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomFloat 1.5 10.5 }}" -verbose 0

26. 随机布尔值

生成随机的布尔值(true 或 false)。

# URL 参数
./http_bench -c 1 -n 1 "https://127.0.0.1:18090?data={{ randomBoolean }}" -verbose 0

# 请求体
./http_bench -c 1 -n 1 "https://127.0.0.1:18090" -body "data={{ randomBoolean }}" -verbose 0

macOS Catalina 构建错误

如果遇到错误 pointer is missing a nullability type specifier when building on catalina,请使用以下解决方法:

export CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined"

贡献

欢迎贡献!请随时提出问题或提交拉取请求。

许可证

本项目采用 MIT 许可证 - 详情请参阅 LICENSE 文件。