grpc测试工具ghz的使用
前言
本文介绍grpc 测试工具 ghz的使用。水平不高,能力有限,错漏之处,还请见谅。欢迎友好讨论。
运行环境信息
-
操作系统版本:ubuntu24.04
ghz简介
ghz是一个Go语言开发的gRPC性能测试和负载测试工具,可以进行
-
性能测试:模拟大量并发请求,测量你的 gRPC 服务在不同负载下的表现,例如每秒能处理多少请求(QPS)、请求的平均耗时等 。 -
负载测试:通过逐步增加请求压力(如每秒请求数RPS),观察服务性能的变化趋势,帮助发现性能瓶颈 。 -
稳定性测试:长时间地向服务发送请求,验证服务在高负载或持续运行下的稳定性和可靠性。 -
功能验证:在开发过程中,快速验证 gRPC 接口是否按预期工作,返回的数据是否正确。
ghz的github开源地址为:https://github.com/bojand/ghz,文档地址:https://ghz.sh/docs/intro。
ghz安装方法
我采用直接下载预编译的二进制文件进行安装,流程如下:
# 访问下载页面: https://github.com/bojand/ghz/releases, 下载对应操作系统版本的二进制文件, 比如ubuntu下wget https://github.com/bojand/ghz/releases/download/v0.121.0/ghz-linux-x86_64.tar.gz# 解压tar -xzf ghz-linux-x86_64.tar.gz
解压后可以发现两个可执行文件,ghz和ghz-web
-
ghz:主程序,负责执行压力测试,向你的 gRPC 服务发起请求,并收集性能数据。 -
ghz-web:可视化工具,负责将ghz生成的测试结果数据,以更友好、更直观的图表和表格形式在浏览器中展示出来。
将ghz和ghz-web放到运行路径:
# 移动到/usr/local/bin/目录下sudo mv ghz ghz-web /usr/local/bin/# 验证安装成功ghz --version # ghz版本ghz-web -v # ghz-web版本

ghz的简单使用
简单使用指令,这里对C++ grpc 认证示例学习中的server_nossl服务器程序进行测试,测试指令如下:
# 压测grpc服务# --insecure: 测试非 TLS 的 gRPC 服务时使用# --proto: 指定 .proto 文件路径,用于解析服务和方法# --call: 指定要调用的完整方法名,格式为 包名.服务名.方法名# -d, --data: 请求消息的 JSON 格式数据# -c, --concurrency: 并发 Worker 数量,并非同时发起的请求数,而是工作协程数# -n, --total: 测试停止时,总共发出的请求数# -r, --rps: 限制每秒请求数(QPS),不设置则表示尽力而为, 这里没有设置# -z, --duration: 测试持续时间,到达设定时间后停止, 比如可以设置 -z 30s, 这里没有用到# -o, --output: 指定输出文件路径, 这里没有用到# -O, --format: 指定输出格式,如 html, json, csv, pretty 等, 这里没有用到ghz --insecure --proto ~/blog_code/auth/proto/hello_world.proto --call helloworld.Greeter.SayHello -d '{"name":"world"}' -c 1 -n 1000 localhost:50051
输出如下:

可以看到输出中包括测试总耗时,响应时间,qps,响应时间分布,结果状态码统计等信息。
ghz_web的简单使用
ghz_web的文档可以参考:https://ghz.sh/docs/web/intro
为了运行ghz_web,需要先设置一个配置文件,配置文件可以是YAML、TOML或者JSON格式。我这里用json格式,设置文件如下:
{"server": {"port": 8990 },"database": {"type": "sqlite3","connection": "/home/ubuntu/tmp/ghz.db" },"log": {"level": "info" }}
-
server-port: ghz web服务端口,默认80 -
database: 数据库,支持sqlite3、mysql和postgres。默认是sqlite3 -
log: 日志设置,包括等级和路径(path)。默认等级是info,默认输出位置是stdout。我这里没有设置路径,直接在stdout输出日志。
设置之后,启动服务:
ghz-web -config ~/tmp/ghz_web_config.json

通过浏览器访问服务:

此时还没有数据,新建一个project:


可以看到新建的project :

可以看到我的项目的ID是2,这个后面上传数据要用到。
然后上传数据。首先要ghz测试的数据按照json格式输出,在 ghz的简单使用 一节中ghz的指令的基础上加上 -O json选项和-o report.json选项运行得到数据:
ghz --insecure --proto ~/blog_code/auth/proto/hello_world.proto --call helloworld.Greeter.SayHello -d '{"name":"world"}' -c 1 -n 1000 localhost:50051 -O json -o report.json
数据在当前文件夹的report.json文件中。

在服务器上执行curl指令,上传数据:
curl -X POST http://localhost:8990/api/projects/2/ingest -H "Content-Type: application/json" -d @report.json # 注意替换路径中的ID '2'为实际ID

注意上传路径 http://localhost:8990/api/projects/2/ingest中的2,指的是要上传到的项目ID,就是前面建立时在界面上看到的ID,替换成实际的即可。
上传完之后,在界面点击项目名,跳转到项目页面。

可以看到已经有数据了。

重复上面的动作,重新跑一组数据上传,则可以看到变化曲线。

我也只是初步使用,更多功能可以查看开源代码(https://github.com/bojand/ghz)或官方文档(https://ghz.sh/docs/intro)进行学习。后续我发现实用的功能也会持续分享。也欢迎有相关使用经验的读者在评论区进行分享。
参考资料
-
腾讯元宝-deepseek(https://yuanbao.tencent.com/)和deepseek官方网站(https://www.deepseek.com/)辅助 -
https://github.com/bojand/ghz -
https://ghz.sh/docs/intro
夜雨聆风