RSS

在 ARM64 (Linux) 上运行 gRPC 和 Protobuf

ARM 处理器最近在计算的许多领域越来越重要,包括传统上被认为是 x86_64 专属的领域。得益于围绕 ARM 生态系统的发展势头,我们可以预期 ARM 平台的采用率将显著增长。对于支持基于 ARM 平台的软件而言,情况亦是如此。

由于 gRPC 和 protocol buffers 的主要目的是互连分布式系统,因此它们在支持 ARM 计算中的作用尤为重要。随着 ARM 云计算的兴起,我们预计许多系统实际上将是 x86 和 ARM 服务器的混合组合,根据需要混合搭配各个生态系统的优势。gRPC 和 protocol buffers 是理想的构建块,可以帮助用户无缝地构建跨越多种体系结构的系统。

为了满足 gRPC 用户对支持 ARM 的高需求,gRPC 团队决定正式并全面支持选定的基于 ARM 的平台。一段时间前,我们开始着手测试所有内容并修复遇到的任何问题。今天,我们很高兴地宣布,C++、C#、Go、Java、Node、PHP、Python 和 Ruby 中的 gRPC 和 protocol buffers 实现已准备好用于 ARM64 Linux 上的生产工作负载(详见下文)。

目前的情况最好用我们已完成的总体领域列表来描述

  • Bugfix/改进: 我们进行了一些修复,以确保 gRPC 和 protobuf 在 ARM64 Linux 上可靠运行。
  • 打包与分发: 对于提供特定于二进制体系结构的包的语言,我们添加了 ARM64 Linux 包,并作为标准发布流程的一部分在每次发布时进行发布。提供即用型二进制包极大地改善了开发人员体验。对于不发布二进制包的语言,我们测试了构建过程按预期工作,并且可以在 ARM64 Linux 上毫无问题地安装 gRPC 和 protobuf。
  • 持续测试: 我们投入了大量资源建立持续测试,确保 gRPC 和 protobuf 得到充分测试并防止未来出现任何回归问题。测试具有大量测试和支持多种语言的大型项目无疑是一项挑战,特别是因为 ARM 体系结构上进行测试的开源生态系统仍处于起步阶段,但我们通过交叉编译、模拟测试和在真实硬件上运行测试的组合,成功地测试了 gRPC 和 protobuf。

gRPC 和 Protobuf 在 ARM64 Linux 上的支持概览

下表详细列出了按语言分类的状态。每个条目总结了 gRPC 和 Protobuf 在 ARM64 Linux 上的支持级别。

语言持续测试分发/包附加信息
C++✔️使用 cmake 或 bazel 从源代码构建(方法与 x86_64 上相同)
C#✔️Grpc.Core nuget 包现已支持 aarch64 Linux(从 v2.38.1 版本开始)Grpc.Tools nuget 包现已支持在 aarch64 Linux 上进行代码生成
Go✔️ 1使用 golang 标准方式安装库(体验与 x86_64 上相同)
Java✔️每次发布时发布的 Maven artifacts 在 aarch64 Linux 上运行良好aarch64 protoc 和 grpc-java protoc 插件在每次发布时都会发布
Node/Javascript✔️使用现有 npm 包(它们是平台无关的)
PHP✔️现有 PECL 和 composer 包在 aarch64 Linux 上运行良好
Python✔️针对 aarch64 Linux 的预构建 wheels 包在每次发布时都会发布(从 v1.38.1 版本开始)grpcio-tools 包现已支持在 aarch64 Linux 上进行代码生成
Ruby✔️暂未提供针对 aarch64 Linux 的预构建原生 gems 包。要使用 grpc-ruby 和 protobuf-ruby,用户需要从源代码构建 gems 包持续测试已就绪并稳定通过,但我们尚未提供预构建包。ruby 中的 gRPC 和 protobuf 可以安全使用,但安装体验欠佳

1 grpc-go 的持续测试已就绪,protobuf-go 的持续测试正在进行中。protobuf-go 已在 aarch64 上手动测试并发现运行可靠。

ARM64 / aarch64 / ARMv8 术语解释

虽然术语 ARM64、aarch64 和 ARMv8 表示的含义略有不同,但在实际中它们经常互换使用。就本文而言,它们本质上含义相同,可以视为同义词。

官方 ARM64 支持目前仅限 Linux

目前,我们仅在 Linux 上官方支持 ARM64 上的 gRPC 和 Protobuf。我们意识到其他平台(例如搭载新 Apple M1 芯片的 MacOS X)也对 ARM64 支持有需求,但其中一些平台面临重大挑战(硬件配置、缺乏仿真等)。与其因为这些复杂性延迟 ARM64 支持的发布,不如先专注于在 Linux 上提供官方 ARM64 支持更有意义——所以我们这样做了。

附录:更改/修复/改进列表

grpc/grpc 仓库

grpc/grpc-java 仓库

grpc/grpc-go 仓库

protocolbuffers/protobuf 仓库