1

ユーザー アクションに応じて 50 ~ 250 のアウトバウンド HTTP 接続を頻繁に行う必要があるアプリケーション (メタ検索エンジン) があります。

これを行う方法は、一連の HttpWebRequests を作成し、Action.BeginInvoke を使用して非同期で実行することです。これは明らかに、独自のスレッドで同期的に実行される Web 要求を起動するために ThreadPool を使用します。これはもともと .NET 2.0 アプリであり、TPL が存在しなかったため、現在はこのようになっていることに注意してください。

ETW (私たちのイベント ソースを .NET フレームワークとカーネルのものと組み合わせたもの) と NetMon を使用すると、スレッド プールは約 300 ミリ秒でコードを実行する 200 のスレッドを開始できますが (したがって、ここではスレッドプールの枯渇の問題はありません)、さまざまな量を占有します。 Windows カーネルがキューに入れられたすべての TCP 接続を確立するのに、最大 10 秒から 15 秒かかる場合があります。

これは NetMon で非常に明白です。すぐに約 60 ~ 100 の TCP 接続 (SYN) が開かれ (数はさまざまですが、約 120 を超えることはありません)、残りの接続は一定期間にわたって細流化します。接続がどこかでキューに入れられているかのようですが、どこにあるのかわからず、これを調整して、より多くの同時発信接続を実行できるようにする方法もわかりません。Perfmon Outbound Connection Queue は 0 のままですが、Connections Established カウンタでは、最初に接続が急増し、残りがフィルタリングされるにつれて徐々に増加することがわかります。

接続先のエンドポイントの近くでコードを実行しても問題はそれほど大きくないため、接続先のエンドポイントへの遅延が一因になっているようです。

私は包括的な ETW トレースを取得しましたが、Microsoft プロバイダーの多くに関する適切なドキュメントはありません。

これを回避するためのアドバイスや、大量の発信接続用にウィンドウを調整するためのアドバイスは素晴らしいでしょう。プラットフォームは Win7 (dev) と Win2k8R2 (prod) です。

4

1 に答える 1