.net - Número máximo de HttpWebRequests concurrentes
multithreading (4)
Estoy poniendo a prueba una aplicación web y he configurado un programa de prueba de Windows que genera varios hilos y envía una solicitud web para cada uno.
El problema es que obtengo el siguiente resultado:
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!
que parece que hay un máximo de 5 hilos, incluso si creo 100 como tal:
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();
}
¿Alguien puede iluminarme sobre lo que está pasando?
Gracias
EDITAR: Si, como se sugirió, duermo durante 5 segundos, en lugar de httpwebrequest, entonces obtengo más hilos disparando pero no tantos como hubiera esperado:
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!
Todavía parece que solo estoy obteniendo 2 hilos comenzando cada segundo, lo que me parece muy lento. ¿Supongo que la Console.WriteLine podría ser un problema?
EDITAR: configuré
ThreadPool.SetMinThreads(100, 4);
y
System.Net.ServicePointManager.DefaultConnectionLimit = 100;
y obtuve los siguientes resultados:
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
así que fue capaz de expulsar un montón de solicitudes web al mismo tiempo. Que parecía cola (llamar a un servidor STA COM +), así que eso es lo que esperaba.
Gracias por tu ayuda
¿Todas (o la mayoría) de sus solicitudes van al mismo host por casualidad? Hay un límite incorporado por host. Puede cambiar esto en app.config en el elemento System.Management connectionManagement .
La otra cosa es que el grupo de subprocesos aumenta gradualmente su cantidad de subprocesos: inicia un nuevo subproceso cada medio segundo, IIRC. ¿Podría ser eso lo que estás viendo? Intenta eliminar HttpWebRequest
de la ecuación, solo duerme un par de segundos ...
Sospecho que el último problema es con el que te encuentras inicialmente, pero el primero te causará problemas también.
Hay un límite en el número de conexiones HTTP salientes simultáneas. Creo que puede controlar esto utilizando la propiedad estática System.Net.ServicePointManager.DefaultConnectionLimit
antes de crear los objetos HttpWebRequest
.
No he escuchado mucho sobre esto para .NET Core. ServicePointManager no se incluyó en .NET Core 1, pero parece estar de vuelta en la versión 2. Sin embargo, para HttpClient, también puede establecer la cantidad máxima de conexiones como esta:
new HttpClient(new HttpClientHandler
{
MaxConnectionsPerServer = 100
})
Si escribo a continuación la etiqueta en la configuración de Windows, no se ejecutará cada vez que se ejecute el código a continuación. De modo que cada vez que se ejecute el código a continuación, se me permitirá tener un máximo de 1000000 no de solicitud / respuesta en paralelo.
HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com");
Etiqueta
<connectionManagement>
<clear/>
<add address="*" maxconnection="1000000" />
</connectionManagement>