11 个版本
0.2.2 | 2024年1月23日 |
---|---|
0.2.1 | 2023年10月30日 |
0.2.0 | 2023年7月30日 |
0.1.12 | 2023年7月30日 |
0.1.5 | 2023年3月20日 |
#1476 在 命令行工具
67 每月下载次数
560KB
2K SLoC
rsb - Rust 基准测试
rsb
是一个用 Rust 编写的 HTTP 服务器基准测试工具。这个工具的开发主要受到了 bombardier
项目的启发,我感谢作者所做的贡献。另一方面,这个工具主要是为了学习和理解 Rust 而开发的。
安装
如果您是 Rust 开发者,并且已经在本地上安装了 Rust 相关的工具链,您可以通过 Cargo 安装它们。
cargo install rsb
或者您可以去 发布页面 下载对应平台的编译版本。如果已安装 Docker,可以直接使用编译好的 Docker 镜像。
// image from github container registry
docker run --rm ghcr.io/gamelife1314/rsb -n 50 -l -c 10 https://httpbin.org
// image from docker hub
docker run --rm gamelife1314/rsb -n 50 -l -c 10 https://httpbin.org
如果您想使用 shell 的自动补全功能,可以通过类似以下命令输出对应 shell 的补全脚本。 rsb
支持 bash
、elvish
、fish
、powershell
和 zsh
。例如
eval "$(rsb --completions zsh)"
用法
首先,让我们看看这个工具的整体情况
该工具运行时有两种模式,使用时必须指定。一种是基于总量,即您需要声明总共需要发送多少个请求,可以通过 -n
参数指定。另一种是基于运行时间,即您需要测试多长时间,可以通过 -d
参数指定,单位是秒。
首先,让我们看看指定总量的例子:
让我们看看指定测试持续时间的另一个例子
在使用过程中,我们通常会遇到太多的指定数字,或者指定的测试时间过长。当你想在中间取消时,可以通过ctrl-c
直接取消。工具接收到信号后,将完成当前请求。直接退出并输出当前统计。
术语表
条目 | 描述 |
---|---|
要求/秒 |
计算每秒发送和接收响应的请求数,然后计算平均值、最大值和标准差。 |
延迟 |
记录每个请求从发送到接收响应的时间,然后计算平均值、最大值和标准差。 |
延迟分布 |
对每个请求的消耗时间进行排序,然后取出每个百分比下的数据,计算其平均值。 |
HTTP代码 |
各种响应代码的数量统计。 |
吞吐量 |
吞吐量通过并发数和平均请求时间相除得到,单位为:reqs/s。 |
头部
可以通过-H
参数指定自定义请求头部,例如:-H=k:v,k1:v1
。需要注意的是,如果设置了Content-Type
,但同时也设置了--json-file
、--json-body
、--text-file
、--text-body
、--mp
、--mp-file
、--form
,则将被覆盖。
代理
工具核心使用request
发送Http请求,因此目前继承了其代理支持。可以通过环境变量http_proxy
设置HTTP请求的代理,通过环境变量https_proxy
设置HTTPS请求的代理。也支持socks
代理。有关代理的更多说明,请参阅此处
。
示例
export http_proxy=http://127.0.0.1:1087;export https_proxy=http://127.0.0.1:1087;export ALL_PROXY=socks5://127.0.0.1:1080
文本体
如果您想将请求体设置为文本类型,可以通过--text-file
指定文件作为输入,或者通过--text-body
指定字符串。请注意,这两个参数只能选择其中一个,不能与其他请求体设置参数共存。在请求时,内容类型将指定为:text/plain
。
示例
rsb -n 100 --text-body "anything" http://127.0.0.1:8000/post-text
// or
rsb -n 1 -m POST --text-body "chatgpt4.0 is coming and very strong" http://127.0.0.1:54326/post-text
JSON体
如果您想发送的数据类型是JSON,可以使用--json-body
参数指定,或者使用--json-file
从文件中读取。在请求时,请求类型将指定为:application/json
。
示例
rsb -n 1 -m POST --json-body '{"version":"v0.1.0","name":"rsb"}' http://127.0.0.1:54326/post-json
// or
rsb -n 1 -m POST --json-file json.txt http://127.0.0.1:54326/post-json
// or build json body from external command, this will call rsbg program to generate request body
cargo run -- -c 50 -t 5s -n 5000 -l --json-command "rsbg hello world xxx 1" -m POST http://127.0.0.1:5302/hello
表单体
如果您想发送类型为application/x-www-form-urlencoded
的请求,需要传递--form
参数。此参数可以多次指定,每次指定可以声明多个键值对。
示例
rsb -n 1 -m POST --form=k:v,k1:v1 --form=k2:v2 http://127.0.0.1:54326/post-form
多部分体
如果您想发送类型为multipart/form-data
的请求,或者想上传文件,可以通过--mp
指定参数,并通过--mp-file
指定要上传的文件。
示例
rsb -n 1 -m POST --mp-file=f1:LICENSE,rsb:target/debug/rsb.exe --mp=k1:v1 http://127.0.0.1:54326/upload-file
客户端证书
如果服务器需要验证客户端的证书,可以通过--cert
和--key
分别指定客户端证书和密钥。
示例
rsb -n 500 -l --cert client.pem --key client-key.pem https://127.0.0.1:9443/hello
您可以通过以下Go代码生成并启动用于测试的https服务器:
...
func main() {
caCert, _ := ioutil.ReadFile("rootCa.pem")
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
tlsConfig := &tls.Config{
ClientCAs: caCertPool,
ClientAuth: tls.RequireAndVerifyClientCert,
}
tlsConfig.BuildNameToCertificate()
server := &http.Server{
Addr: ":9443",
TLSConfig: tlsConfig,
}
http.HandleFunc("/hello", hello)
http.HandleFunc("/headers", headers)
if err := server.ListenAndServeTLS("server.pem", "server-key.pem"); err != nil {
fmt.Println(err)
}
}
依赖项
~21–40MB
~701K SLoC