效能評測
gRPC 旨在支援多種語言的高效能開放原始碼 RPC。本頁面說明效能評測工具、測試考量的情境以及測試基礎架構。
效能評測
概述
gRPC 旨在實現分散式應用程式的高效能和高生產力設計。持續的效能評測是 gRPC 開發工作流程的關鍵部分。多語言效能測試每隔幾個小時就會針對 master 分支執行,這些數字會回報到儀表板以進行視覺化。
效能測試設計
每種語言都會實作一個效能測試工作者,該工作者會實作 gRPC WorkerService。此服務會指示工作者在實際效能基準測試中擔任用戶端或伺服器角色,該基準測試表示為 BenchmarkService。該服務有兩種方法
- UnaryCall – 簡單請求的單元 RPC,指定要在回應中傳回的位元組數。
- StreamingCall – 串流 RPC,允許重複發送請求和回應訊息的乒乓式操作,類似於 UnaryCall。


這些工作者由一個 驅動程式 控制,該驅動程式會接收情境描述 (JSON 格式) 以及指定每個工作者程序主機:連接埠的環境變數作為輸入。
受測程式語言
以下語言在 master 中都有持續的效能測試 (用戶端和伺服器)
- C++
- Java
- Go
- C#
- Node.js
- Python
- Ruby
除了作為效能測試的用戶端和伺服器端執行之外,所有語言都會以用戶端身分針對 C++ 伺服器進行測試,並以伺服器身分針對 C++ 用戶端進行測試。此測試旨在提供特定語言的用戶端或伺服器實作目前效能的上限,而不會測試另一端。
雖然 PHP 或行動環境不支援 gRPC 伺服器 (我們效能測試所需要的),但可以使用以其他語言編寫的 Proxy WorkerService 來評測其用戶端效能。此程式碼已針對 PHP 實作,但尚未處於持續測試模式。
受測情境
在上述儀表板中,有幾個重要的測試情境,包括以下情境
- 無競爭延遲 – 僅有 1 個用戶端一次發送一則訊息時,使用 StreamingCall 所看到的平均值和尾部回應延遲。
- QPS – 當有 2 個用戶端和總共 64 個通道時,使用 StreamingCall 發送的每秒訊息數率,每個通道一次有 100 個未完成的訊息。
- 可擴展性 (針對選定的語言) – 每個伺服器核心的每秒訊息數。
大多數效能測試都使用安全通訊和 Protobuf。某些 C++ 測試還會額外使用不安全通訊和通用 (非 Protobuf) API 來顯示峰值效能。未來可能會新增其他情境。
測試基礎架構
所有效能基準測試都在我們的專用 GKE 叢集中執行,其中每個基準測試工作者 (用戶端或伺服器) 都會排程到不同的 GKE 節點 (每個 GKE 節點都是獨立的 GCE VM),位於我們其中一個工作者集區中。我們使用的基準測試架構的原始碼在 test-infra github 儲存庫 中公開提供。
大多數測試執行個體都是 8 核心系統,這些系統用於延遲和 QPS 測量。對於 C++ 和 Java,我們還支援 32 核心系統上的 QPS 測試。所有 QPS 測試都為每個伺服器使用 2 台相同的用戶端電腦,以確保 QPS 測量不受用戶端限制。