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 用の事前ビルド済みホイールは、各リリースで公開されます(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 のみです
現時点では、ARM64 Linux 上の gRPC および Protobuf のみを公式にサポートしています。他のプラットフォーム(例:新しい Apple M1 Silicon を搭載した 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