基准测试

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

概述

gRPC 既设计用于高性能,也设计用于高生产力的分布式应用程序设计。持续的性能基准测试是 gRPC 开发工作流中的一个关键部分。多语言性能测试每几小时运行一次,测试结果会报告到仪表盘以供可视化展示。

性能测试设计

每种语言实现一个性能测试工作程序,该工作程序实现了 gRPC 的 WorkerService。该服务指示工作程序充当实际基准测试中的客户端或服务器,基准测试服务被表示为 BenchmarkService。该服务有两个方法:

  • UnaryCall — 一个单一请求的单向 RPC,指定响应中返回的字节数。

  • StreamingCall — 一个流式 RPC,允许请求和响应消息的反复 "ping-pong",类似于 UnaryCall。

image 2024 12 24 09 05 31 340

这些工作程序由一个 驱动程序 控制,驱动程序接受一个场景描述(JSON 格式)和一个环境变量,指定每个工作程序进程的主机:端口

测试语言

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

  • C++

  • Java

  • Go

  • C#

  • Node.js

  • Python

  • Ruby

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

尽管 PHP 或移动环境不支持 gRPC 服务器(这是我们性能测试所需的),但它们的客户端性能可以通过使用其他语言编写的代理 WorkerService 进行基准测试。该代码已为 PHP 实现,但尚未进入持续测试模式。

测试场景

有几个重要的场景正在进行测试,并在上述仪表盘中展示,包括以下内容:

  • 无争用延迟 — 只有一个客户端每次发送一条消息时,使用 StreamingCall 所看到的中位数和尾部响应延迟。

  • QPS(每秒消息数) — 在有两个客户端和总共 64 个通道的情况下,每个通道同时有 100 条未处理的消息,通过 StreamingCall 发送时的消息/秒速率。

  • 可扩展性(针对选定语言) — 每个服务器核心每秒处理的消息数。

大多数性能测试使用安全通信和 protobuf。某些 C++ 测试还使用不安全的通信和通用(非 protobuf)API 来显示性能峰值。将来可能会添加更多场景。

测试基础设施

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

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