grpc测试工具ghz的使用

前言

本文介绍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

解压后可以发现两个可执行文件,ghzghz-web

  • ghz:主程序,负责执行压力测试,向你的 gRPC 服务发起请求,并收集性能数据。
  • ghz-web:可视化工具,负责将 ghz 生成的测试结果数据,以更友好、更直观的图表和表格形式在浏览器中展示出来。

ghzghz-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 )进行学习。后续我发现实用的功能也会持续分享。也欢迎有相关使用经验的读者在评论区进行分享。

参考资料

欢迎关注公众号:只做人间不老仙

相关推荐
星辰徐哥6 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥6 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐6 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐6 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
码农阿豪6 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
追逐时光者6 小时前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
后端·.net