我有一批要获取的网址。该列表包含具有不同域名的 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 请求,但即使降低它更多也不会提高性能。
- 应用
async
withTask.WaitAll(Task[])
但这会导致很多错误,因为所有任务的创建速度都非常快,但几乎所有任务都会导致连接错误。
有趣的观察是:
- 我的互联网网络连接并没有真正处于负载状态,因此没有拥塞
- cpu、内存和 IO 也没有真正测试,但 IO 显示下降。