que tienen una página ASP.NET con este código pseduo:¿Por qué Thread.Sleep() es tan intensivo en la CPU?
while (read)
{
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
}
Cualquier cliente que solicita esta página comenzará a descargar un archivo binario. Todo está bien en este momento, pero los clientes no tenían límite de velocidad de descarga, por lo que cambió el código anterior para esto:
while (read)
{
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Thread.Sleep(500);
}
problema de la velocidad se resuelve ahora, pero bajo prueba con 100 clientes simultáneos que se conectan una tras otra (3 segundos retraso entre cada nueva conexión) el uso de la CPU aumenta cuando aumenta el número de clientes y cuando hay entre 70 y 80 clientes simultáneos, la CPU alcanza el 100% y se rechaza cualquier conexión nueva. Los números pueden ser diferentes en otras máquinas pero la pregunta es ¿por qué Thread.Sleep() es tan intensivo en la CPU y hay alguna forma de acelerar el cliente sin que la CPU se eleve?
Puedo hacerlo a nivel IIS pero necesito más control desde el interior de mi aplicación.
Seguramente no se trata de la cantidad de clientes concurrentes ni del momento en que se conectan y reciben datos porque las mismas pruebas se realizan con el mismo número de clientes e incluso a mayor velocidad de descarga (sin límite como Thread.Sleep) y probando durante mucho tiempo y la CPU era <5%, por lo que no se trata de la cantidad de subprocesos disponibles en el grupo de subprocesos de ASP.NET y el tiempo que están vinculados a las solicitudes. Es Thread. Sleep, pero tal vez signifique algo diferente en mi escenario. – Xaqron
¿Cómo lo hace eso no sobre el número de subprocesos? Está manteniendo el mismo número de clientes cuando no está durmiendo, por lo que se usarán menos hilos. –
He hecho eso (mantener la cantidad de clientes igual) con mucho trabajo que simplemente dejarlos dormir pero no tengo CPU subida entonces! Entonces, ¿cómo descansar es más intenso que trabajar? Supongo (después de la revisión de las respuestas de Michael y Jon) que se trata de la forma en que ASP.NET automatiza el uso de subprocesos (supongo que Jon hizo la prueba en la consola no en asp.net) y cuando mi aplicación no duerme, cambia los hilos, pero cuando usas Sleep no los respaldas en la piscina (¡solo una conjetura como la de Michael)! – Xaqron