エイチームフィナジーアドベントカレンダー16日目は私 @NMura3 が担当します。
概要
GCPのサービスの一つである、CloudRunについて今年の9月10月とプレビュー版で公開された、実行環境とCPUの新しい機能について検証した内容を投稿します。
CloudRunとは
CloudRunはGCPで提供されているフルマネージドなコンテナの実行環境です。
AWSでいう、LambdaとECSの中間のようなサービスです。
Lambdaのように実行環境はフルマネージドで、ECSのようにコンテナを実行できます。
フルマネージドなので、スケールアウトも自動で行ってくれるので、運用も非常に楽になります。
また、課金は実行時間とリクエスト数などで課金されます。
CloudRunのCPU
CloudRunのCPUはリクエストが発生すると割り当てられます。
そのため、リクエストが終わったのちに非同期で処理を行いたいユースケースには対応できませんでした。
しかし、9月の発表にて、CPUを常時割り当てる機能(AlwaysCPU)が追加されました。
画面から設定するか、下記コマンドで割当が可能です。
gcloud beta run services update SERVICE-NAME --no-cpu-throttling
- プレビュー版のため、betaのインストールが必要です。
CloudRunの実行環境
こちらGoreplayを入れた話 - Qiitaにも書きましたが、実行環境に第二世代がプレビュー版でリリースされました。
CloudRunで処理を高速化できるかもしれない!?
実行環境の第二世代の機能に前回はシステムコールの件に触れましたが、今回目をつけたのは
- CPU パフォーマンスの高速化
- ネットワーク パフォーマンスの高速化(特にパケットロスがある場合)
です。
これにより、第二世代でCloudRunを動作させる方が速くなるかもしれません。
CPUの方でもAlwaysCPUにしていれば、CPUが常に割り当てられるので高速が期待できるかもしれません。
また、AlwaysCPUでは料金体系が追加され、リクエスト課金が発生せず、単価も15-20%安くなります。
つまり、この2つの組み合わせで、CloudRunを高速に経済的に動かせるのではないかという仮設のもと検証しました。
動作検証
動作検証は下記のパターンをjMeterを用いて行いました。
- 第一世代で通常のCPUとAlwaysCPU
- 第二世代で通常のCPUとAlwaysCPU
で行いました。
また、jMeterでは
1ユーザーのリクエストを3種類を合計12リクエストで行い、スレッドを10で10ループ行いました。
合計1200リクエストが20-30秒で終了するので、秒間50ぐらいのアクセスです。
その検証結果が以下になります。
第一世代で通常のCPUとAlwaysCPU
通常CPU AVG | AlwaysCPU AVG | |
---|---|---|
1回目 | 682ms | 683ms |
2回目 | 684ms | 674ms |
3回目 | 676ms | 684ms |
これはほぼ差がない感じです。
第二世代で通常のCPUとAlwaysCPU
通常CPU AVG | AlwaysCPU AVG | |
---|---|---|
1回目 | 575ms | 578ms |
2回目 | 596ms | 575ms |
3回目 | 581ms | 571ms |
若干AlwaysCPUの方が高速に動いているようにみえますが、あまり差がない感じです。
ですが、先程の結果と比べると明らかに実行環境が第二世代の方が速くなっています。
第二世代はスケールアウトが遅い?
第二世代を使用するとスケールアウトが遅くなるということがドキュメントに書いてありました。
プレビュー版で第 2 世代の実行環境は、一般に持続的な負荷の下では迅速に動作しますが、第 1 世代よりもコールド スタート時間が長くなります。
これがどれほど遅くなるかも調べてみたところ約2倍遅くなっておりました。
第一世代は16秒で起動していましたが、第二世代は32秒ほどで起動しました。
これは検証に使ったプログラムの特性もあると思うので、この値は相対的に捉えてください。
ドキュメントには
コールド スタートは第 2 世代よりも第 1 世代のほうが高速ですが、第 2 世代のプレビュー版が終了するまでに、このパフォーマンスのギャップは小さくなります。
とあるので、正式版になればもっと高速になることを期待しております。
GoReplayを用いて
上記の検証はjMeterを用いた検証なので、ある程度高負荷な状態での検証しました。
また、AlwaysCPUではリクエスト数が多ければ、料金が安くなるので、運用時のリクエスト数で検証するのが良いかと思います。
こんな時に便利なものがGoReplayです。
本番環境と同じリクエストを流せるのでそれで検証しました。
これを見るとAlwaysCPU(緑の線)が1.5から2倍ほど遅くなっております。
これには理由があり、インスタンス数が1だったためです。
インスタンス数を2で検証してもよかったのですが、この間の料金を見ると通常のCPUとAlwaysCPUではほとんど料金の差がありませんでした。
つまり、検証したサービスではAlwaysCPUでのコスト削減は期待できないという結論になりました。
まとめ
いかがだったでしょうか?
個人的にCloudRunのサービスは手軽にコンテナを実行できて、フルマネージドなため運用が非常に楽になります。
そのサービスの新しい機能がが今年の9月10月とプレビューされたので、早速検証してみました。
今回この検証をしてみて思ったのは、こういったプラットフォームな部分の検証は本来やりにくかったり、検証用の環境の構築に手間がかかったりしますが、CloudRunを使っているとGoReplayやjMeterで非常に簡単にできると感じました。