Número máximo de HttpWebRequests simultáneas
Estoy realizando una prueba de estrés de una aplicación web y configuré un programa de prueba de Windows que activa varios subprocesos y envía una solicitud web en cada uno de ellos.
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!
lo que parece que hay un máximo de 5 subprocesos, incluso si creo 100 así:
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 aclararme qué está pasando?
Gracias
EDITAR: Si, como se sugiere, duermo durante 5 segundos, en lugar de httpwebrequest, entonces se activan más subprocesos, 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 recibo 2 subprocesos por segundo, lo que me parece muy lento. Supongo que Console.WriteLine podría ser un problema.
EDITAR: puse
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 pude enviar una gran cantidad de solicitudes web simultáneamente. Lo cual parecía hacer cola (llamando a un servidor STA COM+), así que eso es lo que esperaba.
Gracias por tu ayuda
¿Por casualidad todas (o la mayoría) de sus solicitudes van al mismo host? Hay un límite incorporado por host. Puede cambiar esto en app.config en el elemento system.Net ConnectionManagement .
La otra cosa es que el grupo de subprocesos solo aumenta su número de subprocesos gradualmente: inicia un nuevo subproceso cada medio segundo, IIRC. ¿Podría ser eso lo que estás viendo? Intente deshacerse HttpWebRequest
de la ecuación; en su lugar, simplemente duerma un par de segundos...
Sospecho que el último problema es el que te encuentras inicialmente, pero el primero también te causará problemas.
Existe un límite en la cantidad de conexiones HTTP salientes simultáneas. Creo que puedes controlar esto usando la System.Net.ServicePointManager.DefaultConnectionLimit
propiedad estática antes de crear los HttpWebRequest
objetos.
No he oído mucho sobre esto para .NET Core. ServicePointManager no se incluyó en .NET Core 1, pero parece estar nuevamente en la versión 2. Sin embargo, para HttpClient, también puede configurar el número máximo de conexiones de esta manera:
new HttpClient(new HttpClientHandler
{
MaxConnectionsPerServer = 100
})