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