しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps と App Service Plan で CPU メトリックの単位が異なっている話

WebJob のスケーリングを考えてた時に、サイト単位で CPU 使用率が見れないのに不満しかなかったので、落ち着いて調べました。そもそも、思っていたより理解できてませんでした。

まずは公式ドキュメントと、Azure 界の抱かれたい男 No.1 のブログを読み直します。

App Service の料金 | Microsoft Azure

Azure App Service | ブチザッキ

App Service Plan は仮想マシン自体で、Web Apps や Mobile Apps などのサービスは全て App Service Plan の上に乗っかっている形になります。*1

つまり、スケーリングの単位は Web Apps などではなく App Service Plan 単位になります。

画像はブチザッキから引用しました。あまり関係ないですが Web Apps と API Apps は、Logic Apps の Gateway 削除などが行われた最近のアップデートでほぼ違いが無くなりました。

Web Apps

少し前に行われた Azure Portal のアップデートで、Web Apps の設定にあるスケールアップとスケールアウトが App Service Plan に対するものだとわかりやすくなりました。

しかし、Web Apps で確認できる CPU メトリックは時間になっています。グラフを分単位にすると、1 CPU 当たり 60 秒で計算出来るので、ある程度は CPU 使用率を知ることはできます。

パフォーマンスカウンタが使えないので、プロセス単位の CPU 利用率を直接取得することはできません。

App Service Plan

Web Apps とは異なり App Service Plan は仮想マシン自体なので、それぞれのサイトを含む全体としての CPU 使用率を見れるようになっています。

オートスケールでは CPU 利用率を使うので、基本は App Service Plan のメトリックを見る必要があります。

普段は App Service Plan のメトリックを見ることがあまりないので、% になっていることに気が付きませんでした。これで適切なタイミングでスケールアウトが行えると思います。

オートスケールのメトリック評価について

Azure 界の抱かれたい男 No.1 からオートスケール周りについて指摘されたので、おまけで書いておきます。

App Service Plan のオートスケールは単純な CPU 使用率を指定する方法と、メトリックからオートスケールのルールを作成する方法の 2 種類が用意されています。CPU 使用率も裏側でルールを作っているだけです。

デフォルトでは 10 分間の平均 CPU 使用率が設定した値を超えると、オートスケール処理が実行されます。そしてオートスケール処理が行われてから 5 分間は再度処理は行われないようになっています。

設定についての詳細は公式ドキュメントに載っているので、ちゃんと読みましょうということでした。

わかってしまえば全然難しくないですね。オートスケールのルールは適切に組み立てておかないと、スパイクした場合にクールダウン時間が長いと間に合わずにダウンすることも考えられます。

スケジュール設定も Azure Portal から行えるので、本番環境での設定には気を付けましょう。

追記:複数インスタンスで稼働している場合

Twitter で帝国兵さんから貴重な情報を貰いました。いつもありがとうございます。

App Service Plan をスケールアウトさせている場合には、それぞれのメトリックで表示される値は各仮想マシンのインスタンスでの平均値となっているようです。

個別のメトリックを確認する機能も今後用意されるとのことです。そういえば、Kudu とかも今は 1 つのインスタンス分しか見れないんですよね。仮想マシンを意識しなくてもいいように作られてますが。

*1:ARM 的には Server Farm となっている