会社で製造した社内用Webアプリの1つにSignalRを使って、双方向通信を行うコミニュケーションツールを運用してます。
そのAシステム(仮称)は2ヶ月に1回ぐらい、SignalRが切断し5分ぐらい通信できなくなる不具合がありました。
やっと原因がわかったので、備忘録として記録します。
先にいうと、このシステムはc# mvc entity frameworkで作られており、私がc#の言語仕様とAzureWebサービスの仕様を把握していなかった事が根本的な原因です。
2つの直接原因
1.費用を抑えるため同じサービスプランを共有していた。
システムAの他にSignalRを利用しない別のアプリ(システムB)も同じサービスプラン上で動作させてました。
Azureドキュメントを読んではいましたが正直、理解できてませんでした。
専用のコンピューティング レベルでは、VM リソースは App Service プラン専用であり、他の顧客と共有されません。
ただし、 同じ App Service プラン内に配置するすべてのアプリは、それらの専用リソースを相互に共有します。
つまり、コンピュートはプラン レベルで専用になり、アプリごとのレベルではありません。
アプリごとにコンピューティングを分離するには、別の App Service プランを作成します。
つまり、システムBでモリモリとメモリを食うとシステムAのメモリの利用できる量が圧迫されGCが発生しやすくなるという事のようです。
2.HttpCliantはusingを利用してもメモリ解放されない。
で、システムBがなんでメモリを食うのかと言うとHttpCliantを使い捨てていたのが原因のようです。
ソケット枯渇とメモリ圧迫され、アプリが重くなるようです。
対応方法はHttpCliantを共有し使い回すのが良いとの事。
ありがとうAI