5

私は、会社の複数の Web プロパティの QA を実行する新しいサービスに取り組んでおり、興味深いネットワーク同時実行の問題に遭遇しました。パフォーマンスを向上させるために、TPL を使用して、多数の URL のコレクションに基づいて HttpWebRequests を作成し、それらを並行して実行できるようにしています。ただし、ボトルネックがプロセスのどこにあるかを見つけることができないようです。

これまでの私の観察:

  • TPL経由で最大約25〜30の並列スレッドを取得できます
  • サービスの CPU が 5 ~ 6% 壊れることはありません (H/T の有無にかかわらず、1 ~ 4 コアで実行)
  • NIC の使用率が 2 ~ 3% を超えることはありません
  • 全体的なネットワーク トラフィックは影響を受けていないようです (他のユーザーは文句を言わず、同時に速度テストを実行しても大きな影響は見られません)。
  • オフィス ネットワーク (15Mbps) とデータ センター (100+Mbps) のどちらで実行しても、速度はあまり変わりません。
  • 1 つのホストから大量のページをダウンロードするのではなく、複数のホストから一度にダウンロードすることで、パフォーマンスが少し向上します。

考えられる問題点:

  • CPU (コアまたはハードウェア スレッドの数)
  • NIC
  • 同時 HttpWebRequests の最大許容数
  • LAN
  • ワン
  • ルーター/スイッチ/ロードバランサー

質問は次のとおりです。

明らかに、インターネット全体を数分でダウンロードする方法がありますが、このようなシナリオのどこにボトルネックがあり、それを克服するために何ができるかを知りたいと思っています.

補足として、現在、クロールにサードパーティのサービスを使用していますが、いくつかの点で制限があり、より柔軟にしたいと考えています. 矢の先端にある企業秘密のソースや毒についての何か... :)

4

3 に答える 3

7

次のいずれかが原因であると強く疑っています。

  1. デフォルトの接続制限に達しています。ServicePointManager.DefaultConnectionLimit の値を確認してください。1000 などの実質的に無限の値に設定することをお勧めします。
  2. TPL は、ネットワークを飽和させるのに必要な数のスレッドを開始していません。リモート Web サーバーでは、大量の遅延が発生する可能性があることに注意してください。待機中、スレッドはネットワークに負荷をかけていません。

TPL は、最小並列度 (DOP) を保証するものではありません。残念なことに、IO を使用する場合、並列度を正確に制御する必要がある場合があります。

特定の DOP を保証する唯一の方法であるため、固定数のスレッドを手動で開始して IO を実行することをお勧めします。正確な値を試す必要があります。It could be in the range of 50 to 500. スレッドの既定のスタック サイズを小さくして、その数のスレッドでメモリを節約できます。

于 2012-06-19T16:34:34.937 に答える
1

コードは実にシンプルです。Parallel.ForEach を使用して、URL (文字列) のコレクションをループ処理します。このアクションは HttpWebRequest を作成し、結果を ConcurrentBag にダンプします。ところで、NCrawler は興味深いようです。確認してみます。ヒントをありがとう。

Parallel.ForEach ではスレッド数を制御できないため、少なくともThreadPool.

を使用QueueUserWorkItemして、タスク コレクションがワーカー スレッドに完全にプッシュされるまで、またはメソッドが false を返すまで (プールにスレッドがなくなるまで)、作業を割り当てることができます。

を使用ThreadPoolすると、割り当てられるスレッドの最大数を制御できますSetMaxThreads

于 2012-06-19T17:05:57.577 に答える
1

TCP 接続の制限に達したか、接続を適切に破棄していない可能性があります。いずれにせよ、JMeter などを使用して、取得できる同時 HTTP スループットの最大値を確認してください。

于 2012-06-19T16:37:50.307 に答える