Максимальное количество одновременных запросов HttpWebRequests - PullRequest
60 голосов
/ 01 сентября 2009

Я испытываю стресс-тестирование веб-приложения и настроил программу тестирования 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 ]

69 голосов
/ 01 сентября 2009

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

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

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

53 голосов
/ 01 сентября 2009

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

6 голосов
/ 24 октября 2017

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

new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })
4 голосов
/ 19 ноября 2014

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

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

Метка

<connectionManagement>
 <clear/>
 <add address="*" maxconnection="1000000" />
</connectionManagement>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...