読者です 読者をやめる 読者になる 読者になる

Yuichi Murata's Engineering Blog

Go / App Engine / GCP とか書いていきます

Auto Scaling と Basic Scaling は何が違うのか 【基本性能編】

App Engine の Scale Type には Manual Scaling / Basic Scaling / Auto Scaling の 3 種類があります。

https://cloud.google.com/appengine/docs/go/an-overview-of-app-engine#scaling_types_and_instance_classes

このうち Basic Scaling と Auto Scaling はいずれもユーザーからのリクエスト数に応じてインスタンス数が増減するものでありますが、果たして何が違うのでしょうか。気になったので調べてみました。

本稿では、Basic Scaling と Auto Scaling の基本性能に差があるのか調べてみたという話をします。

なぜ Auto Scaling を選ばないのか

Auto Scaling をあえて避け、Basic Scaling を使う唯一無二の理由が max_instances が設定できる点です。放っておけば無限に Scale するというのは、やはり怖いものです。自分が仕事で App Engine を使うときはこれを理由に Basic Scaling にするケースがあります。

その一方で Auto Scaling の方が、ユーザーリクエストをさばくために最適化されているのでそちらを使うべきという話も聞きます。では具体的に Basic Scaling に比べて Auto Scaling の何がどう違うのでしょうか。

一つ思い浮かぶのがスピンアップの性能です。App Engine ではインスタンスのスピンアップ時にリクエストがつまりがちです。Auto Scaling でインスタンスの起動が最適化された結果、効率良くスケールするという話なのであれば、Auto Scaling を使う大きなモチベーションとなると思います。

実験

では、Auto Scaling と Manual Scaling の基本性能に差があるのか実験してみます。実験方法は以下のとおりです。

  1. Hello World アプリを Auto Scaling と Basic Scaling の両方の設定でそれぞれデプロイする (それぞれデフォルトの設定とする)
  2. それぞれのアプリに 1 度だけアクセスして初期インスタンスを立ち上げておく
  3. GCE インスタンスから 10,000 リクエストを 50 並列でそれぞれ投げる
  4. レスポンスタイムと試行後に立ち上がっているインスタンス数を比較する
  5. インスタンス数が落ち着くのを待つ
  6. 2~5 を 3 セット繰り返す

これによって、Auto Scaling と Manual Scaling のデフォルトの設定でどう差が出てくるかを計測することができます。

結果

レスポンスタイム

リクエストを送ってから最初の 1byte を受信するまでの時間を以下に示します。

type no min max mean sd
basic 1 43.65ms 1.95s 872.74ms 619.05ms
2 51.62ms 1.97s 689.88ms 650.14ms
3 46.45ms 1.80s 773.17ms 705.55ms
auto 1 9.10ms 629.67ms 145.54ms 180.33ms
2 48.13ms 1.06s 162.63ms 196.64ms
3 49.39ms 1.22s 321.27ms 378.75ms
  • basic scaling

f:id:yuichi1004:20170108223840p:plain

  • auto scaling

f:id:yuichi1004:20170108223842p:plain

結果を見てみると Auto Scaling のほうが スピンアップ時にレスポンスタイムが伸びにくくなっていることが分かります。 max の値は Basic Scaling が 2 秒弱なのに対して、Auto Scaling の方は 1 秒強です。そして標準偏差も Auto Scaling が明らかに少なくなっています。これは Auto Scaling のほうが スピンアップを伴ってもレスポンスが安定している ことを示しています。

グラフを見ると Auto Scaling のほうがスピンアップを挟んでもレスポンスが比較的安定しているのが良く分かります。

インスタンス

各施行後のインスタンス数を以下に示します。

type no instances
basic 1 5
2 5
3 5
auto 1 4
2 7
3 7
  • Basic Scaling

f:id:yuichi1004:20170108230744p:plain

  • Auto Scaling

f:id:yuichi1004:20170108230742p:plain

試行後のインスタンス数に関しては非常に興味深い結果が得られました。まず Basic Scaling に対して Auto Scaling のほうがより多くのインスタンスを立ち上げました。これはおそらく急に大量のリクエストを送ったため、より過敏に対応をしたものと考えられます。

Basic Scaling はグラフを見ても単純に反応をしていることが分かります。リクエストが来た瞬間にインスタンスが立ち上がり、その後すぐに落ちています。

一方 Auto Scaling は一発目のスパイクこそ即座に反応をしすぐに落ち着いたものの、二回目のスパイクを検知するとより多くのインスタンスを立ち上げ、そして暫くの間インスタンス数を維持しました。これは Auto Scaling が単純なリクエストの有無だけではなくて、直近のスパイクも含めて総合的に判断しているためと考えられます。

結論

今回の実験結果から、Auto Scaling の方がより賢く状況を判断し、かつ効率よくスピンアップする ことがわかりました。直接ユーザーリクエストをさばく、インスタンス数が頻繁に上下するようなサービスにおいては Auto Scaling を使うのが賢そうです。

今回はデフォルト設定での基本性能の比較となりましたが、次は各種パラメターでどのように差が出てくるのかを見てみようと思います。