1

フェッチしたい URL のバッチがあります。リストには、異なるドメイン名の URL (50.000 以上) が含まれていますが、すべてのドメインが同じ負荷分散サーバー IP を使用しています。

URLごとに、結果コード、フェッチ期間、コンテンツのハッシュ、およびリダイレクトヘッダーをログに記録したいと思います。

現在の方法では、1 秒あたり約 10 回のフェッチが行われ、応答時間は約 0.5 秒です。

次の実行を高速化するにはどうすればよいですか?

現在、次のコード構成があります。

Parallel.ForEach(domainnames, ProcessItem);

ProcessItem以下に基づいています。

static void Fetch2(Uri url)
{
    HttpWebResponse response;
    try
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.AllowAutoRedirect = false;
        response = (HttpWebResponse)request.GetResponse())
    }
    catch (WebException ex)
    {
        response = ex.Response as HttpWebResponse;
    }

    if (response == null) return;

    using (response)
    {
        // Process response.....
    }
}

次の構成が適用されています。

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="100" />
    </connectionManagement>
</system.net>

私は次のことを試しました:

  • おそらく多くの Web リクエストを処理していると思っていたので、new ParallelOptions { MaxDegreeOfParallelism = 25 } を指定して Parallel.ForEach を制限しますが、それ以上下げてもパフォーマンスは向上しません。
  • but を適用するasyncTask.WaitAll(Task[])、すべてのタスクが非常に高速に作成されるため、多くのエラーが発生しますが、ほとんどすべてが接続エラーになります。

興味深い観察結果は次のとおりです。

  • 私のインターネットネットワーク接続は実際には負荷がかかっていないため、混雑していません
  • cpu、メモリ、および IO も実際にはテストしていませんが、IO は落ち込みを示しています。
4

0 に答える 0