gRPC 基准测试
gRPC旨在支持多种语言的高性能开源RPC。本文描述了性能基准测试工具、测试所考虑的场景以及测试基础设施。
概述
gRPC是为分布式应用程序的高性能和高生产率而设计的,持续的性能基准测试是gRPC开发工作流程的关键部分。多语言性能测试每小时对主分支运行一次,这些数字会被报告给仪表板进行可视化。
Multi-language performance dashboard @latest_release (lastest available stable release)
Multi-language performance dashboard @master (latest dev version)
C++ detailed performance dashboard @master (latest dev version)
额外的基准测试提供了对CPU使用情况的精细洞察。
C++ full-stack microbenchmarks
C Core shared component benchmarks
性能测试设计
每种语言都实现了一个性能测试工作器,该工作器实现了gRPC工作器服务。该服务指示工作人员充当实际基准测试的客户端或服务器,表示为BenchmarkService。该服务有两种方法:
一元RPC:简单请求的一元RPC,指定在响应中返回的字节数
流式传输:一种流式RPC,允许重复ping请求和响应消息,类似于UnaryCall
这些工作人员由一个驱动程序控制,该驱动程序将场景描述( JSON格式)和指定每个工作人员进程的host:port的环境变量作为输入。
测试语言
作为主服务器上的客户端和服务器,以下语言具有连续的性能测试:
C++
Java
Go
C#
node.js
Python
Ruby
此外,来自C内核的所有语言在每次请求时都进行有限的性能测试(smoke testing)。
除了作为性能测试的客户端和服务器端运行之外,所有语言都被测试为针对C++服务器的客户端,以及针对C++客户端的服务器。此测试旨在为给定语言的客户端或服务器实现提供当前的性能上限,而无需测试另一方。
尽管PHP或移动环境不支持gRPC服务器(这是我们性能测试所需要的),但是他们的客户端性能可以使用用另一种语言编写的代理WorkerService进行基准测试。这个代码是为PHP实现的,但是还没有处于连续测试模式。
测试场景
有几个重要场景正在测试中,并显示在上面的仪表板中,包括以下场景:
无争用延迟:一次只有一个客户端使用StreamingCall发送单个消息时出现的中值和尾部响应延迟
QPS :当有2个客户端和总共64个信道时的消息/秒速率,每个信道一次有100条未完成的消息使用StreamingCall发送
可伸缩性(对于所选语言):每个服务器核心每秒的消息数
大多数性能测试都使用安全通信和原型缓冲器。一些C++测试还使用不安全的通信和通用(非原型) API来显示最高性能。将来可能会添加其他场景。
测试基础设施
所有性能基准都是通过我们的Jenkins测试基础设施在GCE中作为实例运行的。除了上述gRPC性能方案之外,我们还运行基准netperf TCP_RR延迟数,以了解底层网络特性。这些数字显示在我们的仪表板上,有时会因我们的实例在GCE中的分配位置而异。
大多数测试实例是8核系统,这些用于延迟和QPS测量。对于C++和Java,我们还支持在32核系统上进行QPS测试。所有QPS测试对每台服务器使用两台相同的客户端机器,以确保QPS测量不受客户端限制。