本文主要介绍了 gRPC 压测工具 ghz 的安装、使用。

安装

可以直接在 releases 页面下载二进制文件后解压到系统 PATH 目录,也可以直接使用 go install github.com/bojand/ghz/cmd/...@latest 安装到 $GOPATH/bin 目录下。

使用方法

ghz 使用命令比较简单

$ ghz [<flags>] [<host>]

可用的选项可以使用 ghz –help 查看,也可以在 Options Reference 查看更详细的说明。

常用选项

基本参数

-config : 指定配置文件。

--proto : 指定 proto 文件。

--protoset : 指定 protoset 文件。

要创建 protoset 文件,可使用 protoc 来生成

$ protoc --proto_path=. --descriptor_set_out=bundle.protoset *.proto

如果没有使用 --proto--protoset 选项, ghz 会尝试执行 服务器反射

--call : 指定调用方法,格式为 package.Service.Method 或者 package.Service/Method

-i/--import-paths : 指定 proto 导入路径列表,多个路径以逗号分隔。

--cacert : 指定用于验证服务器的受信任根证书的文件的路径,默认情况下,ghz 尝试使用系统的默认根证书创建安全连接。可以使用 -skipTLS 选项跳过 TLS 验证。

--cname : 验证 TLS 证书时服务器名称。

--cert : 指定客户端证书(公钥)的文件的路径,与 --key 联用。

--key : 指定客户端私钥的文件的路径。

--skipTLS : 跳过服务器证书链和主机名的 TLS 客户端验证。

--insecure : 使用明文和非 TLS 的连接。

--async : 尽量使请求异步。 在发送下一个之前不等待当前请求完成。

--authority : 用作 :authority 伪标头的值。 仅在使用 -insecure 时有效。

这貌似是一个 HTTP/2 的伪请求头,网上资料不多,也很少用到 HTTP/2 中的 HTTP 语义

-d : 请求参数,JSON 格式

-D : 以文件方式指定请求参数,值为 JSON 文件的路径

-o :输出路径,默认为 stdout

-O/--format :输出格式,可取值为 summary, csv, json, pretty, html, influx-summary, influx-details。 默认为 summary

负载参数

-r/--rps :指定 RPS (Requests per second) 使ghz以恒定的 RPS 发送请求

--load-schedule :负载调度算法,可取值如下

  • const : RPS 恒定 ,默认
  • step : RPS步进增长
  • line : RPS 线性增长

以下四个参数配合 --load-schedule 使用

--load-start :step、line 的起始 RPS

--load-step :step、line 的步进值或斜率值

--load-end :step、line 的负载结束值

--load-step-duration : 在每个阶段需要持续的时间

--load-max-duration :最大持续时间,到达则结束

并发参数

-c/--concurrency=50 : 为 const 并发调度并发运行的请求工作线程数。默认值为 50。

--concurrency-schedule : 并发调度算法,和 --load-schedule 相似。

以下参数配合 --concurrency-schedule 使用

--concurrency-start :起始并发数 –concurrency-end :结束并发数 --concurrency-step :并发数步进值 –concurrency-step-duration :在每个阶段需要持续的时间 --concurrency-max-duration :最大持续时间

一个测试示例

ghz --proto=/path/to/grpc-testing-0.0.1/grpc-testing-server/api/echo.proto \
-d '{"msg":"hello"}' \
--insecure \
-c 10 -n 1000 \
-o output.html \
-O html \
--call echo.echo.Echo \
127.0.0.1:8080