OutOfMemoryException がスローされたときに ASP.NET アプリをリサイクルする方法

OutOfMemoryException がスローされたときに ASP.NET アプリをリサイクルする方法

Server 2019 上の IIS で実行される ASP.NET アプリ (.NET Framework 4.8) があります。ここ数週間、顧客がサイトで大きなメモリ ブロックを必要とする操作を実行しようとすることが数回発生しました。ASP.NET ランタイムはメモリ内でそのような大きなブロックを見つけることができず、OutOfMemoryException をスローします。サイトは引き続き動作しますが、一部のページは動作し、一部のページは動作しません。IIS アプリケーション プールの状態はすべて正常であるように見えますが、実際には、プールを手動でリサイクルするまで、サイトの大部分は動作しません。

アプリケーション プールでは、プライベート バイトが数 GB を超えると既にリサイクルが設定されていますが、サイトが動作していないときに w3wp プロセスを見ると、数百 MB しか使用されていません。この例外がスローされたときに ASP.NET または IIS にリサイクルを指示する方法はありますか?

答え1

これは、IIS およびアプリケーションから外部的に監視および処理する必要があります。スケジュールされたタスクがコマンド ラインからアプリケーション プールを停止/開始するためのトリガーとして使用できる例外がアプリケーション イベント ログに存在する可能性があります。

これもかなり基本的なガベージ コレクション設定のようです。少なくとも、すべてのアプリケーションをサーバー GC 用に構成する必要があります。

さらに、適切なヘルス チェックを容易にするために追加できるコードがある可能性があります。ロード バランサーのヘルス チェックでは、.NET Framework の使用を強制するページを使用するのが長年の標準手順となっています。メモリ不足例外によりアプリケーション プールがクラッシュした場合、そのヘルス チェックは失敗する必要があります。

関連情報