前言
本文介绍grpc 测试工具 ghz的使用。水平不高,能力有限,错漏之处,还请见谅。欢迎友好讨论。
运行环境信息
- 操作系统版本:ubuntu24.04
ghz简介
ghz是一个Go语言开发的gRPC性能测试和负载测试工具,可以进行
- 性能测试:模拟大量并发请求,测量你的 gRPC 服务在不同负载下的表现,例如每秒能处理多少请求(QPS)、请求的平均耗时等 。
- 负载测试:通过逐步增加请求压力(如每秒请求数RPS),观察服务性能的变化趋势,帮助发现性能瓶颈 。
- 稳定性测试:长时间地向服务发送请求,验证服务在高负载或持续运行下的稳定性和可靠性。
- 功能验证:在开发过程中,快速验证 gRPC 接口是否按预期工作,返回的数据是否正确。
ghz的github开源地址为:github.com/bojand/ghz, 文档地址:ghz.sh/docs/intro。
ghz安装方法
我采用直接下载预编译的二进制文件进行安装,流程如下:
shell
# 访问下载页面: 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放到运行路径:
shell
# 移动到/usr/local/bin/目录下
sudo mv ghz ghz-web /usr/local/bin/
# 验证安装成功
ghz --version # ghz版本
ghz-web -v # ghz-web版本

ghz的简单使用
简单使用指令,这里对mp.weixin.qq.com/s/_54ixo8Dr... 中的server_nossl服务器程序进行测试,测试指令如下:
shell
# 压测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的文档可以参考:ghz.sh/docs/web/in...
为了运行ghz_web,需要先设置一个配置文件,配置文件可以是YAML、TOML或者JSON格式。我这里用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输出日志。
设置之后,启动服务:
shell
ghz-web -config ~/tmp/ghz_web_config.json

通过浏览器访问服务:

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


可以看到新建的project :

可以看到我的项目的ID是2,这个后面上传数据要用到。
然后上传数据。首先要ghz测试的数据按照json格式输出,在 ghz的简单使用 一节中ghz的指令的基础上加上 -O json选项和-o report.json选项运行得到数据:
shell
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指令,上传数据:
shell
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,替换成实际的即可。
上传完之后,在界面点击项目名,跳转到项目页面。

可以看到已经有数据了。

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

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