Параллельно обрабатывать список элементов веб-запроса максимально быстро

У меня есть партия 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 показывает провалы.

0 ответов

Другие вопросы по тегам