#http-server #benchmark #http #tool #performance #body #command

nightly bin+lib rsb

一个用 Rust 编写的 HTTP 服务器基准测试工具

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命令行工具

Download history 8/week @ 2024-03-07 3/week @ 2024-03-14 3/week @ 2024-03-28 2/week @ 2024-04-04 1/week @ 2024-05-16

67 每月下载次数

MIT 许可证

560KB
2K SLoC

rsb - Rust 基准测试

Build Status License MIT Codecov Crates.io

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 支持 bashelvishfishpowershellzsh。例如

eval "$(rsb --completions zsh)"

用法

首先,让我们看看这个工具的整体情况

rsb --help

该工具运行时有两种模式,使用时必须指定。一种是基于总量,即您需要声明总共需要发送多少个请求,可以通过 -n 参数指定。另一种是基于运行时间,即您需要测试多长时间,可以通过 -d 参数指定,单位是秒。

首先,让我们看看指定总量的例子:

rsb -n url

让我们看看指定测试持续时间的另一个例子

rsb -d url

在使用过程中,我们通常会遇到太多的指定数字,或者指定的测试时间过长。当你想在中间取消时,可以通过ctrl-c直接取消。工具接收到信号后,将完成当前请求。直接退出并输出当前统计。

rsb-cancel

术语表

条目 描述
要求/ 计算每秒发送和接收响应的请求数,然后计算平均值、最大值和标准差。
延迟 记录每个请求从发送到接收响应的时间,然后计算平均值、最大值和标准差。
延迟分布 对每个请求的消耗时间进行排序,然后取出每个百分比下的数据,计算其平均值。
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