[レポート]AWS Graviton2(Arm64)で.NET 6のパフォーマンスを加速させる #XNT303 #reinvent

2021.12.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

AWS re:Invent 2021で行われた、「Accelerate .NET 6 performance with Arm64 on AWS Graviton2」セッションのレポートです。

この記事では、要点・見どころ・ポイントについてまとめてみました。

セッション概要

DESCRIPTION

In this session, learn how to achieve up to 30% more performance and 40% better price performance over comparable current-generation x86-based instances running .NET 6 applications on AWS Graviton2. Dive into the details on how to compile ASP.NET Core for Arm64 and deploy to Graviton2. Next, learn how to automate the deployment process with an Arm64-based CI/CD pipeline and benchmark a sample application on both Graviton2 and x86 instances to quantify the benefits. Finally, explore differences in threading strategies versus x86-based instances and other optimization techniques that will give you the confidence to build .NET 6 applications with Graviton2.

SPEAKERS

  • Carlos Santos
  • Kirk Davis

SESSION LEVEL

  • 300 - Advanced

レポート

Graviton2の概要

Graviton2の基礎情報のおさらい。
プロセッサーの特徴やこれまでの歴史が整理されている。

Graviton2(Arm64)とIntel/AMD(x86-64)の比較

安価なコストとvCPUの考え方を説明。
セッションを通してこの2つの違いは繰り返し述べられている。

Graviton2での.NETの対応状況

これまでの.NETにおけるバージョンごとの経緯と現在の対応状況を紹介。
また、マイクロソフトにおけるランタイムのサポート状況にも触れている。

ここでは.NET 5.0で大幅にArm64環境での実行パフォーマンスが上がった点を紹介。
背景としてハードウェア組み込み関数の対応が進んでいる点を挙げている。

.NET 6.0ではさらに改善された点も紹介している。

デモ

各AWS環境で.NETを実行するデモを実施し、最後にパフォーマンス測定を行っている。

EC2

ここではt4gインスタンスに.NET 6.0をセットアップする簡単なデモを実施。
Visul Studio CodeのRemote SSH拡張機能を使ってデバッグをしている。

Lambda

本日時点では.NET 3.1を使ってGraviton2に対応したLambdaをどうデプロイするのかをデモ。
近い将来.NET 6がLambdaのマネージドランタイムとして追加される予定。カスタムランタイムは必要ない。

AWS Toolkit for Visual Studioを使って.NET 6.0コードをGraviton2 Lambdaへデプロイするイメージを.NET 3.1を使って説明している。

CI/CDパイプライン

CI/CDパイプラインにおいても、Armを採用するデモ。
CodeBuild実行コンテナは既にArmプロセッサでの実行をサポートしている。
パイプラインのデプロイでECS, EC2, Lambda全てのGraviton2環境へデプロイが可能。

パイプラインにArmを活用し始めるのことも、ワークロードで稼働させることもとても簡単なことがデモを通してわかる。

ここでは、ASP.NET 6.0をt3aインスタンスとt4gインスタンスへデプロイしパフォーマンステストも行っている。
また、デモの中ではArmプロセッサの弱点を補うためのC#の実装テクニックなども紹介している。

テスト処理の実装としては、暗号化とUnicodeエンコード処理を行っているもの。

エンドポイント 応答時間
x86 290ミリ秒前後
Arm 220ミリ秒前後

約25%のパフォーマンスが向上している。
しかも、ArmインスタンスのコストはAMDインスタンスよりも約10%低い。

結果としてパフォーマンスが向上するだけでなく、費用も少なくなった。

.NET 5.0が登場したころにGraviton2環境でベンチマークテストをした結果がブログにあるので参考にする

Powering .NET 5 with AWS Graviton2: Benchmarks | AWS Compute Blog

Graviton2は様々なサービスでサポートされている

さいごに、今後も様々なサービスでGraviton2対応が進んでいくことを紹介している。
今年では、CodeBuildやEC2 Iamage Builderなどでの対応も進んでことを挙げている。

まとめ

Graviton2を採用することで.NETアプリケーションのコストパフォーマンスの向上に繋がる可能性が高いことがわかりました。
単純にGraviton2を比較すると苦手な処理もあると思っていたのですが、.NET自体のArmパフォーマンス改善が進んでいるためか、.NET環境においては自分がこれまで思っていた以上にメリットが大きそうだなと感じました。
もう少し実際のデータを集めたいですが、これは.NETワークロードであれば積極的に移行の評価をしたほうが良いかもしれません。

パフォーマンス測定の前後でGraviton2+.NETにおける具体的な実装テクニックに触れている点も注目です。
Microsoftの.NETチームが利用するベンチマークインフラストラクチャである、Microsoft.Crankにも触れていて、学びが多いです。
是非動画をご視聴ください。

ちなみに、セッション内ではアプリケーションによって実行結果が異なるので、必ずパフォーマンス測定を行うことを推奨していますのでご注意ください。