基准测试
gRPC 旨在支持多种语言的高性能开源 RPC。此页面描述了性能基准测试工具、测试考虑的场景以及测试基础设施。
基准测试
概述
gRPC 旨在为分布式应用程序提供高性能和高生产力的设计。持续的性能基准测试是 gRPC 开发工作流程的关键部分。每隔几个小时,多语言性能测试就会针对主分支运行,这些数字会报告给仪表板进行可视化。
性能测试设计
每种语言都实现了一个性能测试工作器,该工作器实现了一个 gRPC WorkerService。此服务指示工作器充当实际基准测试的客户端或服务器,表示为 BenchmarkService。该服务有两个方法
- UnaryCall – 一个简单的请求的 Unary RPC,指定响应中返回的字节数。
- StreamingCall – 一个流式 RPC,允许重复进行类似于 UnaryCall 的请求和响应消息的 ping-pong。


这些工作器由一个 驱动程序 控制,该驱动程序将场景描述(以 JSON 格式)和一个环境变量作为输入,该环境变量指定每个工作器进程的 host:port。
受测语言
以下语言在主分支上作为客户端和服务器都进行持续的性能测试
- C++
- Java
- Go
- C#
- Node.js
- Python
- Ruby
除了作为性能测试的客户端和服务器端运行外,所有语言都作为客户端针对 C++ 服务器进行测试,并作为服务器针对 C++ 客户端进行测试。此测试旨在提供给定语言的客户端或服务器实现的当前性能上限,而不测试另一侧。
虽然 PHP 或移动环境不支持 gRPC 服务器(这是我们的性能测试所必需的),但可以使用另一种语言编写的代理 WorkerService 对其客户端性能进行基准测试。此代码已为 PHP 实现,但尚未处于持续测试模式。
受测场景
有几个重要的场景正在测试中,并在上面的仪表板中显示,包括以下内容
- 无争用延迟 – 使用 StreamingCall 一次仅发送一条消息的 1 个客户端看到的中间和尾部响应延迟。
- QPS – 当有 2 个客户端和总共 64 个通道时,每个通道一次使用 StreamingCall 发送 100 个未完成消息时的消息/秒速率。
- 可伸缩性(对于选定的语言) – 每个服务器核心的消息/秒数。
大多数性能测试都使用安全通信和 protobufs。一些 C++ 测试还使用不安全通信和通用(非 protobuf)API 来显示峰值性能。未来可能会添加其他场景。
测试基础设施
所有性能基准测试都在我们专用的 GKE 集群中运行,其中每个基准测试工作器(客户端或服务器)都会被调度到不同的 GKE 节点(每个 GKE 节点都是我们其中一个工作器池中的单独 GCE VM)。我们使用的基准测试框架的源代码可在 test-infra github 存储库 中公开获得。
大多数测试实例都是 8 核系统,这些系统用于延迟和 QPS 测量。对于 C++ 和 Java,我们还支持 32 核系统上的 QPS 测试。所有 QPS 测试都为每台服务器使用 2 台相同的客户端计算机,以确保 QPS 测量不受客户端限制。