基准测试

gRPC 旨在支持多种语言的高性能开源 RPC。本页面介绍了性能基准测试工具、测试考虑的场景以及测试基础设施。

基准测试

gRPC 旨在支持多种语言的高性能开源 RPC。本页面介绍了性能基准测试工具、测试考虑的场景以及测试基础设施。

概述

gRPC 旨在用于分布式应用的高性能和高生产力设计。持续性能基准测试是 gRPC 开发流程的关键部分。多语言性能测试每隔几小时针对 master 分支运行一次,并将这些数字报告到仪表盘以供可视化。

性能测试设计

每种语言都实现了一个性能测试 worker,该 worker 实现了一个 gRPC WorkerService。该服务指导 worker 作为客户端或服务器来执行实际的基准测试,实际测试表示为 BenchmarkService。该服务有两个方法:

  • UnaryCall – 一个一元 RPC,接收一个简单请求,该请求指定在响应中返回的字节数。
  • StreamingCall – 一个流式 RPC,允许请求和响应消息的重复 ping-pong,类似于 UnaryCall。

gRPC performance testing worker diagram

这些 worker 由一个 driver 控制,该 driver 接受一个场景描述(JSON 格式)作为输入,以及一个指定每个 worker 进程的 host:port 的环境变量。

受测语言

以下语言在 master 分支上同时作为客户端和服务器进行持续性能测试:

  • C++
  • Java
  • Go
  • C#
  • Node.js
  • Python
  • Ruby

除了作为性能测试的客户端和服务器端运行外,所有语言还作为客户端针对 C++ 服务器进行测试,并作为服务器针对 C++ 客户端进行测试。此测试旨在提供给定语言的客户端或服务器实现的当前性能上限,而不测试另一端。

虽然 PHP 或移动环境不支持 gRPC 服务器(我们的性能测试需要它),但它们的客户端性能可以使用用另一种语言编写的代理 WorkerService 进行基准测试。此代码已为 PHP 实现,但尚未处于持续测试模式。

受测场景

有几个重要的受测场景,并显示在上面的仪表盘中,包括以下内容:

  • 无争用延迟 – 在只有 1 个客户端使用 StreamingCall 一次发送单个消息时观察到的中位数和尾部响应延迟。
  • QPS – 当有 2 个客户端和总共 64 个通道时,消息/秒 的速率。每个通道同时有 100 个使用 StreamingCall 发送的未决消息。
  • 可伸缩性(对于选定的语言)– 每服务器核心的消息/秒数。

大多数性能测试使用安全通信和 protobufs。一些 C++ 测试还使用非安全通信和通用(非 protobuf)API 来显示峰值性能。未来可能会添加其他场景。

测试基础设施

所有性能基准测试都在我们专用的 GKE 集群中运行,其中每个基准测试 worker(客户端或服务器)被调度到我们一个 worker 池中的不同 GKE 节点上(每个 GKE 节点都是一个独立的 GCE VM)。我们使用的基准测试框架的源代码在 test-infra GitHub 仓库 中公开可用。

大多数测试实例是 8 核系统,这些系统用于延迟和 QPS 测量。对于 C++ 和 Java,我们额外支持在 32 核系统上进行 QPS 测试。所有 QPS 测试为每个服务器使用 2 台相同的客户端机器,以确保 QPS 测量不受客户端限制。

最后修改于 2022 年 1 月 24 日:更新基准测试页面的仪表盘链接 (#930) (e7c6231)