フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

認証プロバイダ Keycloak の手元テストでコストパフォーマンス最強となった AWS Graviton3

みなさんこんにちは。エンジニアの佐藤です。今回はAWS製プロセッサGraviton3の強さを再確認した、というお話です。

難しい!今時のEC2インスタンス選び

AWS EC2にはさまざまな種類のインスタンスがあります。本稿執筆時点(2024年4月初旬)では、最新世代のCompute Optimizedタイプのインスタンスとして以下の3種類が利用可能です。

種類 プロセッサ 一般利用開始 アーキテクチャ
C7g AWS Graviton3 2022-03 arm64
C7i Intel 4th gen Xeon 2023-09 x86_64
C7a AMD 4th gen EPYC 2023-10 x86_64

AWSは自社開発のGravitonプロセッサの利用を勧めています。他の2つに対して価格が低めに設定されており、電力効率も高いと宣伝されています。Amazonプライムデーなどの自社企画では、これらを活用して優れた電力効率を実現したことが発表されています。一方、Intelは業界一番の老舗であり、一昔前まではクラウド向けプロセッサをほぼ独占供給していました。しかし近年はAMD社製プロセッサの性能向上が著しく、シェアを伸ばしています。

Gravitonプロセッサはarm64と呼ばれる命令セットを採用しているのに対し、Intel/AMDx86_64と呼ばれる命令セットを採用しています。arm64は大雑把にいえばスマートフォンで支配的な命令セットで、これに対しx86_64は伝統的なパソコンで支配的な命令セットです。この2つの命令セットには互換性は無く、ネイティブモジュールはそれぞれ用意する必要があります。とはいえソースコードから再コンパイルすればよく(一部アセンブラで最適化されている部分を除く)、ほとんどのライブラリモジュールは両方の命令セットで提供されています。また、スクリプト(JavascriptPython)やJavaバイトコードは命令セットが異なっても相互運用が可能です。

以上は基本的な話ですが、これに加えて、近年のプロセッサは特定用途向けの命令セットを備えています。代表的なものは以下のような命令セットです。

  • ベクトル演算: 行列計算を高速に行う。
  • 暗号計算: AES, RSA, ECDSAなどの処理を高速に行う。

これらの処理が主要な用途では、適した命令セットを活用することでパフォーマンスアップと電力効率アップが期待できます。ただし新しい命令セットの活用はソフトウェアの対応を要するほか、その他の汎用命令との組み合わせによってはかえって非効率になる場合もあります。

以上のように、今時の最適なEC2インスタンスは、実行するソフトウェアに依存する時代となりました。複雑になったものです。

KeycloakとACCP(Amazon Corretto Crypto Provider)

今回パフォーマンス検証をしたのは、オープンソース認証プロバイダのKeycloakです。シングルサインオン(SSO)を実現するパッケージで、商用版はRedHat Single Sign-Onとして販売されています。

Keycloakは主にJavaで記述されており、arm64とx86_64の両方で実行することができます。

ところで認証プロバイダの主要な処理とは何でしょうか?基本的にはデータベースに各種データを保存するREST APIサーバーですが、パスワード認証やトークンの署名などで暗号計算を頻繁に行います。このため、暗号計算向け命令セットの活用による性能アップが期待できます。AWSAmazon Corretto Crypto Provider(ACCP)を提供しており、Graviton3プロセッサのアピールポイントの一つである暗号計算命令セットが活用できる可能性があります。

パフォーマンス検証を行なったのは、認証プロバイダの最も基本的な機能であるOAuth2 Authorization Code Grantを、2万5千回実行するタスクです。オープンソース認証プロバイダが選択される一つのユースケースとして、ある時刻に極端に大きなトラフィックを受けるオンラインイベントが考えられます。多数のユーザーが一斉にログインするシナリオで、EC2の各種プロセッサにどのような性能差が出るのかを検証しました。

以下のような処理フローとなります。 ※ 赤枠は暗号処理

検証環境

以下が、今回のパフォーマンス検証の環境です。

基本的に、EC2インスタンスにdockerコンテナを展開して作成しました。Keycloakコンテナを十分高負荷にする構成を選び、また、Keycloakは他と同一ラックに収容されないよう、異なるAZに配置しました。

負荷がけではApache Sparkを実行して25,000ユーザーの一斉ログインを仕掛けました。1タスク200ユーザーの粒度で、2 executorで実行。1 executorあたり8スレッドを起こしてそれぞれのユーザーのログイン処理を実行しました。Sparkジョブの開始時刻と終了時刻の差分を所要時間として計測し、計測はKeycloakコンテナ起動直後のコールドスタートと、再実行した場合の合計2回行い、平均を評価しました。

Keycloakには、以下の6種類を用意しました。(価格は本稿執筆時点のもの)

名称 Keycloakコンテナ EC2インスタンス 東京リージョンの価格(米ドル/時間)
base-c7g オフィシャル※1(arm64) c7g.xlarge 0.091
base-c7a オフィシャル(x86_64) c7a.xlarge 0.1292
base-c7i オフィシャル(x86_64) c7i.xlarge 0.11235
accp-c7g カスタム※2(arm64) c7g.xlarge 0.091
accp-c7a カスタム(x86_64) c7a.xlarge 0.1292
accp-c7i カスタム(x86_64) c7i.xlarge 0.11235

※1: quay.io/keycloak/keycloak:23.0.7 ※2: Keycloak 23.0.7、Amazon Corretto 17、Amazon Corretto Crypto Provider(ACCP) v2.3.3を利用したカスタムビルドコンテナ

ベンチマーク中は、KeycloakインスタンスのCPU使用率が80%前後と高率で、負荷がけ環境、nginx, postgresはいずれもCPU使用率は低い状態でした。結果には各CPUの性能差が反映されると期待しました。

結果

細かい数値は割愛します。結果のサマリーは以下の2点です。

  • c7g.xlargeが最も優秀。accp-c7gはbase-c7aと比較して97%の性能を、70%のコストで実現する。1米ドルあたりの性能は36%も高い。
  • Amazon Corretto Crypt Providerの効果は、c7g.xlargeが最も高い。

ログイン速度は、速い順にc7a, c7g, c7iとなりました。また、c7a, c7gではACCPを利用した方が高速になり、c7aで+4%、c7gで+8%の改善となりました。c7aとc7gでは論理コア機能が無効で1物理コア=1論理コアとなっています。これに対してc7iは1物理コア=2論理コアとなっていますので、このような結果になったと考えられます。

速度を価格で除した「1ドルあたりの処理速度」は、高い順にc7g, c7a, c7iとなりました。Graviton3プロセッサの費用効率の高さが際立ちます。

結論として、Keycloakを展開する場合は、c7gインスタンスが最善の選択と言えると思います。ACCPを忘れずに適用しましょう。

振り返って

ここまでお読みいただきありがとうございます。AWSはGravitonプロセッサの費用対効果を盛んに宣伝していますが、それを裏付ける結果となりました。昨今はプロセッサにさまざまな専用命令が搭載されるようになり、それらを活用することで一層のパフォーマンスアップが実現できます。今回のケースで言えば、漫然とx86_64とKeycloakオフィシャルコンテナを使うより、arm64とACCP付きカスタムコンテナにすることで4割近い価格性能比向上を実現できました。最新テクノロジーを常に評価していくことが重要だと思います。