在 ARM64 (Linux) 上运行 gRPC 和 Protobuf
ARM 处理器最近在许多计算领域的重要性日益增加,包括传统上被认为是 x86_64 独有的领域。由于 ARM 生态系统的发展势头,我们可以预期 ARM 平台的采用将显著增长。为支持基于 ARM 的平台提供软件也是如此。
由于 gRPC 和协议缓冲区的主要目的是互连分布式系统,因此它们在支持 ARM 计算方面的作用尤为重要。随着 ARM 云计算的兴起,我们预计许多系统实际上将是 x86 和 ARM 服务器的混合组合,根据需要混合和匹配每个生态系统的特性。gRPC 和协议缓冲区是理想的构建块,可使用户构建可以无缝跨越多种架构的系统。
为了满足 gRPC 用户对支持 ARM 的强烈需求,gRPC 团队已决定正式全面支持选定的基于 ARM 的平台。前一段时间,我们开始努力测试所有内容并修复遇到的任何问题。今天,我们很高兴地宣布,C++、C#、Go、Java、Node、PHP、Python 和 Ruby 中的 gRPC 和协议缓冲区实现已为 ARM64 Linux 的生产工作负载做好准备(详见下文)。
当前的状态最好通过我们完成的一般领域列表来描述
- 错误修复/改进: 我们进行了一些修复,以确保 gRPC 和 protobuf 在 ARM64 Linux 上可靠运行。
- 软件包和分发: 对于提供二进制架构特定软件包的语言,我们添加了 ARM64 Linux 软件包,并且我们开始在每次发布时将其作为我们标准发布过程的一部分发布。拥有随时可用的二进制软件包可以极大地改善开发人员的体验。对于不发布二进制软件包的语言,我们测试了构建按预期工作,并且可以毫无问题地在 ARM64 Linux 上安装 gRPC 和 protobuf。
- 持续测试: 我们投入了大量资源来设置持续测试,以确保 gRPC 和 protobuf 得到充分测试并防止未来出现任何倒退。测试具有许多测试和支持多种语言的大型项目绝对是一项挑战,特别是因为 ARM 架构上的测试开源生态系统仍处于起步阶段,但我们通过交叉编译、模拟测试和在真实硬件上运行测试成功地测试了 gRPC 和 protobuf。
ARM64 Linux 上 gRPC 和 Protobuf 支持概述
在下表中,您可以查看按语言分解的详细状态。每个条目都总结了 ARM64 Linux 上 gRPC 和 Protobuf 的支持级别。
语言 | 持续测试 | 分发/软件包 | 附加信息 |
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 工件在 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 预构建的原生 gem。为了使用 grpc-ruby 和 protobuf-ruby,用户需要从源代码构建 gem。 | 持续测试正在进行中并且始终通过,但我们尚未提供预构建的软件包。在 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
仓库
- https://github.com/grpc/grpc/pull/25258
- https://github.com/grpc/grpc/pull/25418
- https://github.com/grpc/grpc/pull/25453
- https://github.com/grpc/grpc/pull/25517
- https://github.com/grpc/grpc/pull/25602
- https://github.com/grpc/grpc/pull/25717
- https://github.com/grpc/grpc/pull/25928
- https://github.com/grpc/grpc/pull/26136
- https://github.com/grpc/grpc/pull/26409
- https://github.com/grpc/grpc/pull/26416
- https://github.com/grpc/grpc/pull/26430
grpc/grpc-java
仓库
- https://github.com/grpc/grpc-java/pull/8113
- https://github.com/grpc/grpc-java/pull/7812
- https://github.com/grpc/grpc-java/pull/7822
grpc/grpc-go
仓库
protocolbuffers/protobuf
仓库
- https://github.com/protocolbuffers/protobuf/pull/8280
- https://github.com/protocolbuffers/protobuf/pull/8391
- https://github.com/protocolbuffers/protobuf/pull/8392
- https://github.com/protocolbuffers/protobuf/pull/8485
- https://github.com/protocolbuffers/protobuf/pull/8501
- https://github.com/protocolbuffers/protobuf/pull/8544
- https://github.com/protocolbuffers/protobuf/pull/8638