Azure App Service のメモリ使用率について

App Service プランの Basic 以上は使用可能メモリの上限が決まっている。 同じ App Service プラン上に複数の Web Apps などを載せて使用することが出来るが、これはつまり、同じインスタンスのメモリを食い合っていることに他ならない。

例えば 5 個の Web App リソースを B1 プラン (メモリ 1.75GB) の同一 App Service プラン上に載せて、それぞれに素の ASP.NET MVC アプリをデプロイした場合、それぞれの Web App でワーカープロセスが動作しているのであれば、App Service としては大体 60% 前後のメモリ使用率が発生する。

App Service のアプリ設定には「常時接続」項目があり、これを「オフ」にするメリットは何なのかと思うかもしれない。 常時接続をオフにした場合、一定時間 (20 分) 使用されないとワーカープロセスが自動で終了するが、恐らく、上記のようにあまり使われない複数のアプリを同居させた際に使っていないアプリのワーカープロセスを落とすことで、複数アプリ同居時の効率を上げるためのオプションなのかと思う。なので、アプリを 1 つしか使っていないのであれば、常時接続をオフにするメリットは何もないと思われる。

以下は、上述した 1 つの B1 App Service に 5 個の Web Apps を載せた時のメモリ使用率の例。

f:id:poke_dev:20190407015637p:plain

最初に 55% まで上がり、その後、アプリを追加するごとにメモリ使用率が上昇して一度 65% ぐらいまで上がっている。 その後また 55% まで下がったのは、常時接続をオフにした後、アプリの再起動を行い、強制的にワーカープロセスを落としたため。 そこからまた 60% まで上昇しているのは、それぞれのアプリにアクセスしてワーカープロセスが起動したため。

ワーカープロセスが起動していなくても 55% までしかメモリ使用率が落ちないと言うか、そもそも最初の時点で 55% に達しているのがやや不思議だが、どうやらこれは、純粋なアプリの使用率ではなく、土台の OS も含めた使用率らしく、その部分で 55% (= 約 1GB) 常にもっていかれている様子。

Azure App Service Memory Usage. Where to see full breakdown? - Stack Overflow

以下は、アプリでのワーカープロセス使用がない状態で、Basic プランを B1 (1.75 GB) -> B2 (3.5 GB) -> B3 (7 GB) に上げていった際のメモリ使用率の変化。

f:id:poke_dev:20190407024343p:plain

それぞれのプランでの最低使用率が、B1 (54%) -> B2 (33%) -> B3 (20%) と低くなっていくことが分かる。 このパーセンテージで計算すると、プランを上げた際に最低使用量も B1 (950 MB), B2 (1.16 GB), B3 (1.4 GB) のように増加しているため、アプリ以外のメモリ消費量はプランによらず固定というわけでもない様子。

それぞれのプランでアプリが使用可能な残メモリを計算すると、B1 (800 MB), B2 (2.34 GB), B3 (5.6 GB) となるので、 アプリで使用可能なメモリ量 のみにフォーカスすると、プランが上がるほどお得になっている (CPU やその他リソースの事もあるので、メモリだけで一概にお得度は判断できないが)。

どうせなので、Basic, Standard, Premium (V1) についても B1 から P3 まで順に切り替えていってアプリのワーカープロセスなし状態のメモリ消費状況を確認してみたが、Basic, Standard, Premium 間で特に差異はなかった。

f:id:poke_dev:20190407134219p:plain

1.75 GB 3.5 GB 7 GB
B1 (52%) B2 (33%) B3 (20%)
S1 (51%) S2 (33%) S3 (21%)
P1 (51%) P2 (35%) P3 (20%)