2021/09/27:サイジングの基礎値でいいのを見つけたので、それをベースに修正しています。
本記事では、シングルサインオンのサイジング基礎値について記載します。
たとえば、1分間で2千人のユーザがログインする要件があったり、全体で10万人ログイン状態を維持しないといけないとかの場合、どれぐらいのCPUとメモリのリソースが必要かの感覚が掴んで貰えればいいかなと思います。
今回シングルサインオンで使うソフトウェアは、OSSのKeycloakです。
OSSのKeycloakの商用版が、Red Hat Single Sign-On(SSO)になります。
現時点のRed Hat SSOの最新版が7.4で、それに対応するKeycloakは9.0.12です。
今回は、1台構成でやってます。リクエストあれば、設定変えたり、クラスタ構成などでもやってみようかと思います。(ないかな)
*:本記事は、あくまで執筆者の見解です。公式な内容ではありません。
サイジング基礎値の項目
サイジング基礎値の項目は、以下の2つとします。
項目 | 対応するリソース | 補足 |
---|---|---|
最大同時実行数 | CPU | 1秒間で最大何人ログインできるか(待ちに入らずに) |
最大同時ログイン数 | メモリ | 最大何人ログインしっぱなしできるか |
今回は、NWの帯域やDB周りなどは、見ませんので。
測定環境
課金を気にしながら、AWS上でやりました。
・EC2: r5.xlarge(vCPU:4,メモリ:32G)
・OS:Red Hat Enterprise Linux release 8.3 (Ootpa)
・keycloakバージョン:9.0.12
・JDK:openjdk 1.8.0
・keycloakの設定:Standaloneでrealmを1個追加
・Javaのヒープサイズ:-Xms20G -Xmx20G
測定したあとに、もう少し安いインスタンスでよかったなと思いました。。
メモリの測定
計測が面倒くさくなるため、強制FullGCを実行して、Old領域を見ます。
javaヒープの測定は、jstatでやりました。
計測の順番は以下です。
1:ウォームアップ実施(siegeで10000セッションぐらい作る)
2:セッションを全部破棄する
3:強制フルGC x2 (keycloak自体の利用ヒープなどはOld領域に移動)
4:セッションを作りまくる(siege)
5:強制フルGC x2
・計算式
セッションの総メモリサイズ ≒ 5のOld領域 - 3のOld領域
1セッションあたりのメモリサイズ = セッションの総メモリサイズ ÷ セッション数
・今回の環境での結果
5のOld領域:91817.5KB - 3のOld領域:71699.6KB ≒ セッションの総メモリサイズ:20117.9KB
セッションの総メモリサイズ:20117.9KB ÷ セッション数:11548 ≒ 1セッションあたりのメモリサイズ:1.74KB
100万セッションでも、1.66GBぐらいですね。
※:上の値をそのまま使うのではなく、1ユーザで複数セッション作る場合もあるので係数かける必要があります。また、New、Old領域なども考慮して、Javaヒープのサイズは決めます。
CPUの測定
処理待ちが発生しなくて、CPU負荷がそこそこかかる絶妙な多重度で実行します。
CPUの測定は、sarでやりました。
1:ウォームアップ実施(siegeで10000セッションぐらい作る)
2:セッションを全部破棄する(なんとなく)
3:強制フルGC x2 (なんとなく)
4:いい感じの負荷をかける(siege)
・計算式
コア単位の平均CPU利用率(平均) ≒ 測定時の平均CPU利用率(平均) ÷ 搭載コア数
CPU単価 = コア単位の平均CPU利用率(平均) ÷ 1秒間のログイン処理数(平均)
1秒間のログイン処理数は、siegeのtransactions÷elapsed_timeでOK
・今回の環境での結果
測定時の平均CPU利用率(平均):58.14% ÷ 搭載コア数:4 ≒ コア単位の平均CPU利用率(平均):14.53%
コア単位の平均CPU利用率(平均):14.53% ÷ 1秒間のログイン処理数(平均):24.8 ≒ CPU単価:5.86msec
今回の測定結果であれば、1コアあれば、1000(msec)÷5.86(msec)で、1秒間にログイン処理を約170個さばけます。
まとめ
今回は、ほぼデフォ構成のstandaloneで内蔵DBで、だいぶ楽して測定してみました。
オフライン系を有効にすると、DB処理が増えたりすると思うので、CPU単価は増えると思いますし(メモリも)、
DBを外にもって行けば、CPU単価は減ると思います。(AWSだったので、RDSでやればよかった..)
ざっくりなところはありますが、規模感を掴むのには、いいかなと思っています。誰かのお役にたてれば幸いです。
ではでは〜