Максимальное количество одновременных 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
})