1

我有一批要获取的网址。该列表包含具有不同域名的 url(超过 50.000 个),但所有域都使用相同的负载平衡服务器 ip。

对于每个 url,我想记录其结果代码、获取持续时间以及内容的哈希值及其重定向标头。

当前方法每秒获取大约 10 次,响应时间大约为半秒。

我怎样才能更快地执行以下操作?

我目前有以下代码结构:

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>

我尝试了以下方法:

  • 通过指定新的 ParallelOptions { MaxDegreeOfParallelism = 25 } 来限制 Parallel.ForEach,因为我认为我可能正在处理很多 Web 请求,但即使降低它更多也不会提高性能。
  • 应用asyncwithTask.WaitAll(Task[])但这会导致很多错误,因为所有任务的创建速度都非常快,但几乎所有任务都会导致连接错误。

有趣的观察是:

  • 我的互联网网络连接并没有真正处于负载状态,因此没有拥塞
  • cpu、内存和 IO 也没有真正测试,但 IO 显示下降。
4

0 回答 0