フェッチしたい 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 を適用する
async
とTask.WaitAll(Task[])
、すべてのタスクが非常に高速に作成されるため、多くのエラーが発生しますが、ほとんどすべてが接続エラーになります。
興味深い観察結果は次のとおりです。
- 私のインターネットネットワーク接続は実際には負荷がかかっていないため、混雑していません
- cpu、メモリ、および IO も実際にはテストしていませんが、IO は落ち込みを示しています。