Compute Engineインスタンスの Autoscaling

はじめに

私が関わっているサービスでは、非同期処理をアプリケーションのサーバとは分けて別のサーバで行っています。詳細には、アプリケーションサーバから Cloud Memorystore (Redis)にジョブを登録し、非同期処理サーバの Sidekiqがジョブを受けとって処理する構成です (実際にはアプリケーションサーバ冗長化しています)。


f:id:yd0:20200712190229p:plain


非同期処理サーバの利用状況は以下の通りです。

  • 稼働は 24/7
  • 一日のうち、実際に処理が行われているのは 2~3時間程度
  • 処理中、すべてのインスタンスが使われていないことがある
  • 逆に、すべてのインスタンスが CPU使用率 100%に達していることもある


利用状況からリソースの利用効率が悪く、また無駄な費用が発生していることがわかります。 Cloudの特性を活かして 必要なときに必要な分だけ利用する にはどうすれば良いのか調べました。

結論としては、Managed instance groups (MIGs) でインスタンスの Autoscalingを用います。

MIGsの Autoscalingについて

Autoscaling groups of instances

検証

実際に MIGsの Autoscalingを試してみました。

検証の内容/手順

  • インスタンス テンプレートを作成する
  • MIGs を作成する
  • 負荷をかけてスケーリングさせる

インスタンス テンプレートを作成する

Creating instance templates

今回は GCPのコンソールからぽちぽちしました。gcloudや APIでも可能です。

ナビゲーションメニューから Compute Engine > インスタンス テンプレート > インスタンス テンプレート作成 に移動し、インスタンスの設定を行います。


f:id:yd0:20200712152102p:plain

MIGs を作成する

インスタンス テンプレートを作成すると、インスタンス テンプレートの詳細ページに「インスタンスグループを作成する」があるのでそちらに移動します。

今回のポイントとなる設定は以下の通りです。

  • 自動スケーリングモード:
    • 自動スケーリング
  • 自動スケーリング指標:
    • CPU使用率 60% (デフォルト)
  • クールダウン期間:
    • 60秒
  • インスタンスの最小数と最大数
    • 最小数: 1
    • 最大数: 2


f:id:yd0:20200712152640p:plain


クールダウン期間については、インスタンスの起動にかかる時間ちょうどにするのが良いのですが、今回は検証なのでデフォルトの 60秒にしました。

インスタンス グループの作成が完了すると、インスタンス グループの中に設定した最小値の 1つのインスタンスが立ち上がりました。


f:id:yd0:20200712153535p:plain

負荷をかけてスケーリングさせる

準備ができたので、CPU使用率を上げてスケーリングされるか確認します。

インスタンスグループのインスタンスに入り、stressコマンドで CPU使用率を意図的に上げてみます。

$ stress -c 1 -t 300


インスタンスグループの平均 CPU使用率が、設定した 50%前後になるようにインスタンスが追加されます。ただし、今回はインスタンス数の最大値が2なのでそれ以上は増えません。


f:id:yd0:20200712154135p:plain


300秒経過して stressコマンドが終了すると、CPU使用率が 50%を切るため、追加されたインスタンスが削除されていました。

スケールアウトされるのに少しラグがあったのですが、それは Stabilization period という「直近 10分間のピーク時の負荷を基にスケーリングする」仕組みがあったからのようです。

考察・感想

MIGsの Autoscalingを使えば、Cloudの特性である必要なときに必要な分だけリソースを利用することができそうです。 ただ少し残念な点としては、インスタンスグループにおいて、最低でも 1つのインスタンスは稼働していなければならないことです (Cloud Runならその点は解決できそう)

次のステップとしては、Autoscalingで追加されたインスタンスでどのようにアプリケーションを構築 (設定)するかです。Cloud Monitoringでの監視設定や、ログの出力先など、いろいろと考えることが多そうです。。が、楽しくなってきました。