Максимальное количество одновременных запросов 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 может быть проблемой?

РЕДАКТИРОВАТЬ: я установил

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+), так что я ожидал этого.

Спасибо за вашу помощь

4 ответа

Решение

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

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

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

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

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

new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })

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

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

Тег

<connectionManagement>
 <clear/>
 <add address="*" maxconnection="1000000" />
</connectionManagement>
Другие вопросы по тегам