Параллельно обрабатывать список элементов веб-запроса максимально быстро
У меня есть партия URL, которые я хочу получить. Список содержит 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>
Я попробовал следующее:
- Ограничьте Parallel.ForEach, указав новые ParallelOptions { MaxDegreeOfParallelism = 25 }, так как я подумал, что, возможно, я обращался с большим количеством веб-запросов, но даже снижение его больше не приводит к повышению производительности.
- применение
async
сTask.WaitAll(Task[])
но это приводит к большому количеству ошибок, так как все задачи создаются очень быстро, но почти все приводят к ошибкам соединения.
Интересные наблюдения:
- Мое подключение к интернету не сильно загружено, поэтому не перегружено
- Процессор, память и IO тоже не очень интересны, но IO показывает провалы.