gRPC是支持多种编程语言的高性能开源RPC。本文档介绍了性能基准测试工具,测试所考虑的方案以及测试基础架构。
gRPC专用于设计高性能和高生产率的分布式应用程序而设计。持续的性能基准测试是gRPC开发工作流程的关键部分。针对主分支每小时运行多语言性能测试,并将这些测试数据报告给仪表板以进行数据可视化。
额外的基准测试可以提供有关CPU使用情况的细粒度洞察。
每种编程语言都实现了一个gRPC WorkerService的性能测试worker。此服务指示worker充当实际基准测试的客户端或服务器,表示为BenchmarkService。该服务有两种方法:
这些worker进程由驱动程序控制,该驱动程序将场景描述(采用JSON格式)和指定每个worker进程的host:port的环境变量作为输入。
以下编程语言作为master上的客户端和服务端进行连续性能测试:
此外,从C core派生的所有编程语言都在每次拉取请求时进行了有限的性能测试(烟囱测试)。
除了作为性能测试的客户端和服务端运行之外,所有编程语言都与C++版本进行交叉测试:
此测试旨在为给定语言的客户端或服务端实现提供当前的性能上限,而无需测试另一方。
虽然PHP或移动环境不支持gRPC服务端(我们的性能测试需要),但可以使用另一种编程语言编写的代理WorkerService对其客户端性能进行基准测试。此代码是为PHP实现的,但尚未处于连续测试模式。
有几个重要的场景正在测试中并显示在上面的仪表板中,包括以下内容:
大多数性能测试都使用安全通信和protobuf。 一些C++测试还使用不安全的通信和通用(非protobuf)API来显示峰值性能。
所有性能基准测试都通过我们的Jenkins测试基础架构作为GCE中的实例运行。除了上面描述的gRPC性能方案之外,我们还运行基线netperf TCP_RR延迟数,以便了解底层网络特征。这些数字出现在我们的仪表板上,有时会根据我们的实例在GCE中的分配位置而有所不同。
大多数测试实例都是8核系统,这些系统用于延迟和QPS测量。对于C++和Java,我们还支持在32核系统上进行QPS测试。所有QPS测试都为每台服务器使用2台相同的客户端计算机,以确保QPS测量不受客户端限制。