ghz gRPC 压测工具
更新时间:2026-09-18。gRPC 走 HTTP/2 + protobuf,wrk 直接压不了。
ghz是 gRPC 专用压测器,用 proto 驱动构造二进制请求。调试单接口用 grpcurl,协议性能原理见 gRPC keepalive 与多路复用。
一、基本压测
bash
# 指定 proto 与调用,-c 并发 worker、-n 总请求数
ghz --insecure \
--proto ./proto/user.proto --import-paths ./proto \
--call user.UserService/GetUser \
-d '{"id": 123}' \
-c 50 -n 10000 \
localhost:9090| 参数 | 含义 |
|---|---|
--proto / --import-paths | 入口 proto 与解析 import 的根目录(服务端没开反射时必需) |
--call | 全限定方法 包.服务/方法 |
-c | 并发 worker 数 |
-n / -d | 总请求数 / 持续时长(如 -d 30s) |
-d @file.json | 请求数据从文件读;-D data.json 批量/模板数据 |
--insecure | 跳过 TLS 校验(明文/自签) |
-m / --metadata | 传 metadata(header) |
二、输出怎么读
bash
Summary:
Count: 10000
Total: 1.23 s
Requests/sec: 8123.4 # 吞吐
Latency distribution:
50 % 4.1 ms
90 % 8.7 ms
99 % 35.2 ms # 尾延迟
Status code distribution:
[OK] 9980
[Internal] 20 # 非 OK 要按 gRPC code 排查重点:Requests/sec、p99 延迟、Status code 分布(gRPC 的 Unavailable/DeadlineExceeded/ResourceExhausted 分别指下游不可用、超时、限流)。逐步加 -c 找拐点的方法同 wrk。
三、动态数据与流式
bash
# 用 JSON 数组/模板文件为每个请求注入不同参数(写接口唯一 id)
ghz --insecure --proto order.proto --call order.OrderService/Create \
-D orders.json -c 100 -d 30s localhost:9090
# 流模式:--stream-interval / 双向流按 call 类型自动支持
# 服务端流/客户端流/双向流用对应 -d 多条消息与间隔参数
ghz --insecure --proto chat.proto --call chat.Chat/ChatStream \
-d '{"msg":"hi"}' --stream-interval 100ms -c 10 -d 20s localhost:9090连接复用相关:--connections(实际连接数,配合 HTTP/2 多路复用,少量连接承载大量并发流)、keepalive 参数,可对比不同连接/流配比的吞吐。
常见坑
- 拿 wrk 直接压 gRPC:协议不通,必须用 ghz 并提供 proto。
- proto import 找不到:多 proto 互相 import 时要给
--import-paths根目录。 - 写接口用同一份固定数据:全部命中同一行/幂等去重,结果虚高;用
-D注入唯一参数。 - int64/枚举编码:按 proto JSON 规范,int64 用字符串;枚举可用名称或数字。
- 并发≠连接:HTTP/2 多路复用下少数连接即可承载高并发流,盲目堆
-c/连接数不代表真实模型。 - 压测端瓶颈:ghz 自身打满单核或客户端网络受限会限制 RPS,监控压测机并必要时分布式发压。
- 忽略 gRPC 状态码:只看 RPS 不看 code 分布会漏掉限流/超时错误。
总结
ghz 是 gRPC 专用压测器:用 --proto 加 --import-paths 提供消息定义、--call 指定 包.服务/方法,再以 -c 并发 worker 配合 -n 总数或 -d 时长发压,输出 Requests/sec、p50/p90/p99 延迟和按 gRPC code 的状态分布,写接口用 -D 注入唯一参数文件、流式接口用 --stream-interval 构造多消息,并结合 --connections 验证 HTTP/2 多路复用下少量连接承载高并发流;读结果时和 wrk 一样逐级加压找拐点,但必须关注 Unavailable/DeadlineExceeded/ResourceExhausted 等错误码而非只看吞吐,同时避开 proto import 路径缺失、固定数据被幂等去重、int64 要传字符串以及压测机自身瓶颈等坑。