05-基准化分析法

gRPC是支持多种编程语言的高性能开源RPC。本文档介绍了性能基准测试工具,测试所考虑的方案以及测试基础架构。

0.1. 概述

gRPC专用于设计高性能和高生产率的分布式应用程序而设计。持续的性能基准测试是gRPC开发工作流程的关键部分。针对主分支每小时运行多语言性能测试,并将这些测试数据报告给仪表板以进行数据可视化。

额外的基准测试可以提供有关CPU使用情况的细粒度洞察。

0.2. 性能测试设计

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

  • 简单调用:一个简单的PC请求,它指定在响应中返回的字节数
  • 流数据调用:一个流数据RPC允许重复的在请求和响应之间交互,每一次交互过程都类似于简答调用

image

这些worker进程由驱动程序控制,该驱动程序将场景描述(采用JSON格式)和指定每个worker进程的host:port的环境变量作为输入。

0.3. 编程语言测试

以下编程语言作为master上的客户端和服务端进行连续性能测试:

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

此外,从C core派生的所有编程语言都在每次拉取请求时进行了有限的性能测试(烟囱测试)。

除了作为性能测试的客户端和服务端运行之外,所有编程语言都与C++版本进行交叉测试:

  1. 作为针对C++服务端的客户端进行测试
  2. 作为针对C++客户端的服务端进行测试

此测试旨在为给定语言的客户端或服务端实现提供当前的性能上限,而无需测试另一方。

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

0.4. 应用场景测试

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

  • 无竞争延迟:只有1个客户端使用流数据调用,一次发送一条消息时看到的中位数和尾部响应延迟
  • QPS(Query Per Second):有2个客户端和总共64个通道时的每秒处理消息的速率,每个通道使用流数据调用一次发送100个未完成的消息
  • 可伸缩性(针对所选编程语言):每个服务端核心的每秒消息处理速率

大多数性能测试都使用安全通信和protobuf。 一些C++测试还使用不安全的通信和通用(非protobuf)API来显示峰值性能。

0.5. 测试基础架构

所有性能基准测试都通过我们的Jenkins测试基础架构作为GCE中的实例运行。除了上面描述的gRPC性能方案之外,我们还运行基线netperf TCP_RR延迟数,以便了解底层网络特征。这些数字出现在我们的仪表板上,有时会根据我们的实例在GCE中的分配位置而有所不同。

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

上次修改: 14 April 2020