¿Puede afectar el eMule de los usuarios a la capacidad total de mi infraestructura?

Hoy, al ir a comprar el pan me he dado cuenta que una panaderia no es tan diferente a la estructura que puede tener un servicio Web.

Vamos a suponer una panaderia con dos personas tras el mostrador que van atendiendo a los clientes conforme la cola avanza, uno a uno y sin que nadie se cole (¿cola con prioridades?). Normalmente no hay problemas y los clientes pues piden sus barras de pan o pastas, pagan y se van dejando libre para el siguiente cliente, hasta aquí perfecto, el problema está cuando empiezan a servir a aquella señora mayor que todos tememos y que va preguntando a la chica si esto o lo otro, buscando el cambio, etc…, con lo que el tiempo de servicio se multiplica casi por infinito (almenos aparentemente :-P), con lo que la panaderia se queda con la mitad de capacidad de venta, una de las dos personas esta bloqueada por culpa del cliente. El problema se agrava cuando te bloquean a todos los dependientes con clientes lentos ya que la cola no hay forma que avance y algunos clientes fidelizados se te van a la panaderia de la siguiente esquina…
Hasta aqui, diria que todos lo hemos vivido,la unica solución es esperar o llamar a la compañera que está en la trastienda para que atienda a nuevos clientes,deje de hacer lo que hacía (¿human repurpose?) y asumimos el incremento del coste de la venta y el coste de oportunidad de lo que hacía (¿preparar un catering para dentro de un rato que entregaremos justo y tendremos un cliente importante mosqueado?)

Vale, perfecto y esto que tiene que ver con una Web, pues que en la mayoría de servidores (Apache, Tomcat, IIS, WebLogic, Glassfish, etc…) cada petición de cliente se asigna a un thread o hijo y no se libera hasta que acaba de entregar todos los datos, y aquí el problema lo tenemos en que el numero de hijos que generará un servidor está limitado por configuración y si tenemos clientes con poco ancho de banda disponible descargando un objeto relativamente pesado, nos tendrá bloqueados ese numero de threads y si tenemos en cuenta que la mayoría de navegadores lanzan hasta 8 peticiones simultaneas contra el mismo servidor, nos puede gastar hasta 8 hijos cada cliente! y si tenemos en cuenta que un Apache por defecto tiene un límite de 256 conexiones concurrentes, lo que nos da sólo 32 usuarios concurrentes en el peor de los casos, tenemos una panadería con 32 personas tras el mostrador, por tanto si nuestros clientes terminan en medio segundo entre petición, proceso y descarga del resultado, podremos atender 64 clientes por segundo, pero si tarda 32 segundos, todos ellos en la descarga ya que van justos de ancho de banda, solo podremos atender a 1 solo usuario cada segundo y si lo nuestro site esta cargado de objetos voluminosos podemos estar hablando de algunos ordenes de magnitud de diferencia entre la capacidad «punta» de nuestro site trabajando con usuarios cercanos y con ancho de banda «ilimitado» (típico de las pruebas de stress hechas por el equipo de desarrollo) y la capacidad «valle» que serian usuarios muy lejanos con ancho de banda parecido a un dial-up.

Número de peticiones por segundo que soporta un Apache suponiendo los tamaños de objeto indicados y ADSL de 2 Mbits y GPRS de 144 Kbits útiles

Dejo para otro post, las posibles soluciones, que las hay y muy variadas, desde cambiar el tipo de proceso del servidor, modos asíncronos, capas de caché, etc…

Saludos!