ASP.NET Webアプリケーションを許可するワーカープロセスの数を決定するためのベストプラクティスは何ですか?
私が管理する1つのサーバーで、新しいAppPoolを作成すると、デフォルトで10(最大)のワーカープロセスが作成されます。他の人々は、通常の設定が1つであることを示唆しています。
複数のワーカープロセスはどのような問題を解決しますか?また、いくつのワーカープロセスを決定するためのテクニックは何ですか?
ワーカープロセスは、複数のexeでWebサイトの実行をセグメント化する方法です。これにはいくつかの理由があります。1つは、実行時の問題で1人のワーカーが破壊された場合、他のワーカーがダウンしないことです。たとえば、プロセスが何も実行されないHTMLリクエストが発生した場合、その1つのワーカープロセッサによって処理されている他のリクエストのみが強制終了されます。別の例は、1つの要求が同じワーカーによって処理される他のスレッドに対してブロックを引き起こす可能性があることです。
必要な数だけ、負荷テストを行います。アプリを一生懸命ヒットし、1つだけで何が起こるかを確認します。その後、さらにいくつか追加して、もう一度ヒットします。ある時点で、マシンのネットワーク、ディスク、CPU、およびRAMを完全に飽和させることができます。それはあなたが正しいバランスを持っていることを知っているときです。
ちなみに、machine.configファイルを使用して、ワーカープロセスごとに使用されるスレッドの数を制御できます。キーはmaxWorkerThreadsだと思います。
セッションを使用する場合、セッション状態はワーカープロセス間で共有されないことに注意してください。とにかくセッションを避けることをお勧めしますが、それは考慮すべきことです。
すべての意図と目的のために、各ワーカープロセスを独自のWebサーバーと見なすことができます。同じボックスで実行されている場合を除きます。
ここのガイドラインは非常に良いです: http://msdn.Microsoft.com/en-us/library/ms998549.aspx
メモリリーク
もう1つの最大の利点は、メモリリークの処理です。コードをどれだけ最適化しようとしても、フレームワーク自体や他のサードパーティライブラリにメモリリークが発生することがあります。最終的に、アプリケーションが非常に高いメモリに到達し、メモリ例外が発生しなくなることに気付きました。
そのため、ワーカープロセスの仮想メモリの最大制限を1GBに設定し、複数のプロセスの実行を許可する必要がありました。単一のワーカープロセスに対しても最大仮想制限を設定できますが、ワーカープロセスがリサイクルされると、ワーカープロセスが十分な速度になるまですべての要求が遅くなるため、これによりスロースパイクが発生します。アプリケーションには内部キャッシュ(Entity Frameworkクエリキャッシュ、一部のオブジェクトプール)があるため、これらはそれぞれアプリケーションの起動を遅くします。これは、単一のワーカープロセスが最も痛む場所です。
複数のワーカープロセスがある場合、リサイクルモードのプロセスの1つだけが低速ですが、他のプロセスは十分な速度を維持します。
多くのワーカープロセスを持つことが理にかなっているもう1つのケースは、アプリケーションにその並列化を妨げるロックが含まれている場合です。 GDI +ベースの画像処理はその一例です。
私の問題 の解決策を見つけようとしたときに見つけました。