Asp.net-mvcサイトがあり、最近、Webサーバーでメモリ不足の例外が発生しています。アプリケーションプールは1つしかなく、最近設定したIIS一定の制限に達した後にリサイクルするように設定しました。先日行ったところ、4 w3wp.exeプロセスが実行中)が表示されました (それぞれ〜1.8GBのメモリが使用されています)
リサイクルプロセス中に古いワーカープロセスが強制終了されることはなく、ボックスには8 GBのメモリしかないため、最終的にはWebサイトでメモリ不足の例外が発生すると思います。ボックスにメモリを追加できますが、これらの古いプロセスがクリーンアップされない理由が心配です。
このリサイクルプロセスが古いw3wp.exeプロセスを強制終了せずに実行したままにしない理由を理解するための推奨事項はありますか?このリスクを回避するための根本原因または回避策の両方を理解するための提案はありますか?
FFMpeg.exeやいくつかのPDF WPFグラフィックスでの変換、IISプロセスがシャットダウンせず、メモリを発行しないなどエラーが見つかりました。問題はIISではなく、クラッシュした後でもブロックされるプロセス内のいくつかのデッドロックです。
回避策は、Webサイトを2つの別個のWebサイトに分割し、通常はクラッシュしないデータベースでのみトランザクション処理を実行することです。ビデオ/写真の変換、PDF変換、またはクラッシュを引き起こす可能性のあるその他のロジックなどのロジックは、他のWebサービスに移動する必要があります。また、WebサービスからHTTP呼び出しを使用して、Webサービスで処理します。 。
さて、この場合、Webサービスプロセスのクラッシュを回避する方法はまだないため、100リクエストごとにアプリケーションプールワーカーをリサイクルすることにしました(数回のリクエストを見てからこの数を選択しました。 200のリクエストにヒット)し、プールごとに4つのプロセスを作成することで、アプリケーションプールをWebガーデンに変更しました。
このセットアップの利点は、将来的にWebサービスプロセスを他のマシンに簡単に移動できること、プールごとのプロセス数を増減できることです。また、単にトランザクションプロセスを実行しているメインWebサイトは、Webサービスのプロセスリサイクルの影響を受けないため、応答性が高くなります。
アプリケーションプールのリサイクルは通常、古いワーカープロセスをシャットダウンするので、IISのバグに遭遇したとは思いません。
プロセスが孤立した場合、プロセスはより長く存続する可能性があることに注意してください。構成に基づいてIISは、トラブルシューティングのためにそこに残す必要があります。
https://www.iis.net/configreference/system.applicationhost/applicationpools/add/failure
このようなプロセスのデバッグに慣れていない場合は、 http://support.Microsoft.com からサポートケースを開いて、マイクロソフトのサポート担当者にサポートを依頼することをお勧めします。
あなたが追求すべき第一の疑いは、IDisposable
を実装するクラスと、Dispose()
を呼び出さないクラスの使用です。 この質問 への返信としてすでに投稿した同様の問題がありました。
最も可能性の高い原因は、データベース接続で.Dispose()
を呼び出していないことです。 .NETのビルトイン接続プールはサウンドを使用するため、人々はこれについて混乱する傾向があります(-===-)接続を破棄しないでください。ただし、リクエストの最後(または接続の使用が終了したとき)に.Dispose()
を呼び出すのは、リソースリークを防ぐためにすべきことです。接続プーリングでは、これが発生することを想定しています。
私はそうは思わない4 w3wp.exe
プロセスはかなりの懸念事項です。IISが複数のプロセスを生成することは正常です。しかし、アプリケーションに対処する必要のあるリソースリークがあることは明らかです。IDisposable
上で述べたように。それでも問題が解決しない場合は、キャッシュにあるアイテムを確認し、使用できるより効率的なキャッシュ戦略があるかどうかを確認してください。他のすべてが失敗した場合は、アプリケーションのプロファイルを作成してくださいリソースリークの原因を特定できるかどうかを確認します。ほとんどの場合、アプリケーションはIDisposable
を実装していないはずです。
設定IIS一定の制限に達した後にリサイクルするように設定されているが新しいアプリケーションを作成していることは明らかです)プール。
古いものが終了しない理由はいくつかあります。
1つは、メモリリークであり、管理されていないリソースを破棄しない場合があります。これを探すことができます。
別の理由を見つけるには、IISでEnable "Process Orphaning"を有効にします。問題のあるプロセスを見つけるには、「 Process Explorer 」を使用できます。
また、Executableを設定するオプションもあります。これは、プロセスが孤立または破棄されたときに実行されます。
即時の解決策は、特定のCPU制限の後でアクションをKillW3pに設定することです。
<applicationPools>
<add name="DefaultAppPool">
<cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" />
</add>
</applicationPools>