Максимальное количество одновременных HttpWebRequests

Я испытываю стресс-тестирование веб-приложения и настроил программу тестирования Windows, которая объединяет несколько потоков и отправляет веб-запрос для каждого из них.

Проблема в том, что я получаю следующий вывод:

01/09/09 11:34:04 Starting new HTTP request on 10
01/09/09 11:34:04 Starting new HTTP request on 11
01/09/09 11:34:04 Starting new HTTP request on 13
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 15
01/09/09 11:34:06 Starting new HTTP request on 11
01/09/09 11:34:06 11 has finished!
01/09/09 11:34:06 Starting new HTTP request on 14
01/09/09 11:34:06 14 has finished!

который выглядит как максимум 5 потоков, даже если я создаю 100:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text);

    List<BackgroundWorker> workers = new List<BackgroundWorker>();

    for (int N = 0; N < numberOfThreads; N++)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        workers.Add(worker);
    }


    foreach(BackgroundWorker worker in workers)
    {
        worker.RunWorkerAsync();
    }

Может кто-нибудь просветить меня о том, что происходит?

Спасибо

РЕДАКТИРОВАТЬ: Если, как было предложено, я сплю в течение 5 секунд, вместо httpwebrequest, тогда я получаю больше потоков, но не так много, как я ожидал:

01/09/09 11:56:14 Starting new HTTP request on 7
01/09/09 11:56:14 Starting new HTTP request on 11
01/09/09 11:56:15 Starting new HTTP request on 12
01/09/09 11:56:15 Starting new HTTP request on 13
01/09/09 11:56:16 Starting new HTTP request on 14
01/09/09 11:56:16 Starting new HTTP request on 15
01/09/09 11:56:17 Starting new HTTP request on 16
01/09/09 11:56:17 Starting new HTTP request on 17
01/09/09 11:56:18 Starting new HTTP request on 18
01/09/09 11:56:19 Starting new HTTP request on 7
01/09/09 11:56:19 7 has finished!
01/09/09 11:56:19 Starting new HTTP request on 11
01/09/09 11:56:19 11 has finished!
01/09/09 11:56:19 Starting new HTTP request on 19
01/09/09 11:56:20 Starting new HTTP request on 20
01/09/09 11:56:20 Starting new HTTP request on 12
01/09/09 11:56:20 12 has finished!

По-прежнему кажется, что я получаю только 2 потока, начиная каждую секунду, что кажется мне слишком медленным. Я полагаю, что Console.WriteLine может быть проблемой?

EDIT: я установил

ThreadPool.SetMinThreads(100, 4); 

и

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

и получили следующие результаты:

01/09/09 14:00:07 Starting new HTTP request on 11
01/09/09 14:00:07 Starting new HTTP request on 81
01/09/09 14:00:07 Starting new HTTP request on 82
01/09/09 14:00:07 Starting new HTTP request on 79
01/09/09 14:00:07 Starting new HTTP request on 83
01/09/09 14:00:07 Starting new HTTP request on 84
01/09/09 14:00:07 Starting new HTTP request on 85
01/09/09 14:00:07 Starting new HTTP request on 87
01/09/09 14:00:07 Starting new HTTP request on 88
...
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

поэтому он смог одновременно выталкивать множество веб-запросов. Казалось, что очередь (вызов на сервер STA COM +) так, что я ожидал.

Спасибо за помощь

Ответ 1

Все (или большинство) ваших запросов отправляются на один и тот же хост случайно? Там встроенный лимит для каждого узла. Вы можете изменить это в app.config в элементе system.Net connectionManagement.

Другое дело, что пул потоков только постепенно увеличивает количество потоков - он запускает новый поток каждую половину секунды, IIRC. Может быть, это то, что вы видите? Попробуйте избавиться от HttpWebRequest от уравнения - просто спать на пару секунд вместо этого...

Я подозреваю, что последняя проблема - это тот, с которым вы вначале сталкиваетесь, но первая из них также вызовет проблемы.

Ответ 2

Существует ограничение на количество одновременных исходящих HTTP-соединений. Я думаю, вы можете контролировать это, используя статическое свойство System.Net.ServicePointManager.DefaultConnectionLimit, прежде чем создавать объекты HttpWebRequest.

Ответ 3

Если я пишу ниже тег в конфигурации Windows, то будет выполняться каждый раз, когда выполняется код ниже. Таким образом, каждый раз, когда выполняется код ниже, мне будет разрешено иметь не более 1000000 бит параллельного запроса/ответа.

HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com");

Тег

<connectionManagement>
 <clear/>
 <add address="*" maxconnection="1000000" />
</connectionManagement>

Ответ 4

Я ничего не слышал об этом для .NET Core. ServicePointManager не был включен в .NET Core 1, но, похоже, снова вернулся в версии 2. Однако для HttpClient вы также можете установить максимальное количество подключений, например:

new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })