Azure SignalRが全切断する原因がわかった備忘録

会社で製造した社内用Webアプリの1つにSignalRを使って、双方向通信を行うコミニュケーションツールを運用してます。

 

そのAシステム(仮称)は2ヶ月に1回ぐらい、SignalRが切断し5分ぐらい通信できなくなる不具合がありました。

やっと原因がわかったので、備忘録として記録します。

 

先にいうと、このシステムはc# mvc entity frameworkで作られており、私がc#の言語仕様とAzureWebサービスの仕様を把握していなかった事が根本的な原因です。

 

 

2つの直接原因

 

1.費用を抑えるため同じサービスプランを共有していた。

learn.microsoft.com

 

システムAの他にSignalRを利用しない別のアプリ(システムB)も同じサービスプラン上で動作させてました。

Azureドキュメントを読んではいましたが正直、理解できてませんでした。

 

専用のコンピューティング レベルでは、VM リソースは App Service プラン専用であり、他の顧客と共有されません
ただし、 同じ App Service プラン内に配置するすべてのアプリは、それらの専用リソースを相互に共有します
つまり、コンピュートはプラン レベルで専用になり、アプリごとのレベルではありません。
アプリごとにコンピューティングを分離するには、別の App Service プランを作成します。

 

つまり、システムBでモリモリとメモリを食うとシステムAのメモリの利用できる量が圧迫されGCが発生しやすくなるという事のようです。

 

2.HttpCliantはusingを利用してもメモリ解放されない。

で、システムBがなんでメモリを食うのかと言うとHttpCliantを使い捨てていたのが原因のようです。
ソケット枯渇とメモリ圧迫され、アプリが重くなるようです。
対応方法はHttpCliantを共有し使い回すのが良いとの事。

 

ありがとうAI