Cómo aumentar las conexiones simultáneas en Apache

24th Jul 2015Posted in: Tutoriales 0

Hoy vengo a hablaros una vez más de uno de los servicios web más usados en todo el mundo: El servidor web Apache2.

Se trata de un tema del que se ha hablado multitud de veces, pero ahora vengo a hablaros de otra característica muy a tener en cuenta con este servicio: El límite de conexiones simultáneas. No importa si tenemos muy básico o una nave espacial con un procesador i7 y 32 GB de ram…

El límite de conexiones simultáneas siempre será el mismo a menos que tomemos las medidas adecuadas, lo que significa que si queremos tener muchas personas conectadas al mismo tiempo, no solo requeriremos un buen hardware, sino que también una buena configuración.

En este caso no es necesario instalar nada, todo se basa en simples conceptos que hay que tener en cuenta para configurar apache; conceptos que hay que tener muy claros antes de querer hacer cualquier cambio.

apache2_logo

Lo primero que habría que pensar es: ¿Qué capacidad tiene mi equipo? ¿Cuantas conexiones simultáneas puede llegar a soportar mi equipo si lo llego a forzar el máximo posible? Todo esto depende de un único factor; la memoria RAM (Random Access Memory).

A mayor la memoria RAM, mayor el número de conexiones, si bien no existe un valor fijo (es decir X clientes por cada X ram), es por ello que antes de nada es importante hacer unos pequeños cálculos en nuestro servidor web, con el fin de conocer nuestros límites.

Lo primero que habría que saber es cuanta memoria RAM de media consume cada conexión a Apache, ya que cada conexión establecida supone un cierto consumo de RAM en el sistema… Obviamente no todas las conexiones consumen la misma ram, con lo que habría que hacer una media… Todo ello se puede obtener con el siguiente comando:

ps -ylC apache2 --sort:rss | awk '{SUM += $8; I += 1} END {print SUM/I/1024}'

El resultado obtenido estaría representado en megabytes y puede variar dependiendo del número de conexiones activas, el tipo de páginas a las que se accede, etc… Por ello es recomendable realizar la prueba con diferentes pestañas abiertas; cada una de ellas mostrando distintos contenidos a ser posible. En mi caso por ejemplo el resultado ha sido de 9.5458 lo que si lo redondeamos al superior serían 10 MB de RAM consumidos de media por conexión.

Además es importante saber cuanta memoria RAM es consumida por el resto de procesos que hay activos en el sistema, ya que el servicio web no es el único que corre en el sistema operativo y es necesario dejar memoria RAM libre en el servidor para que pueda ejecutar el resto de tareas. Esto se puede obtener con el comando mostrado a continuación:

ps -N -ylC apache2 --sort:rss | awk '{SUM += $8} END {print SUM/1024}'

El resultado obtenido también sería representado en megabytes, y nos mostraría con bastante precisión la cantidad de RAM consumida por el resto de procesos; en mi caso 800 MB. Con esta información podríamos hacer un calculo general de la cantidad de conexiones simultáneas que podríamos tener; calculo que obtendríamos mediante una operación bien sencilla.

(RAMTOTAL – RAM_RESTOPROCESOS) / RAM_POR_CONEXIÓN

Con esta formula en mano, imaginemos que tenemos un equipo con 4 GB RAM, es decir 4096 MB y que nuestro equipo a mostrado los resultados antes mencionados; el cálculo sería:

(4096 – 800)/10= 329 conexiones simultáneas

El problema con este calculo es que uno demasiado extremista, ya que nos consumiría toda la RAM (haciendo que el servidor consuma swap) y además, en caso de tener una base datos, como MySQL o cualquier otra, las conexiones a ésta también consumirían RAM, con lo que el número obtenido se podría calificar como un número utópico. Por ello, para dejar libre la memoria para posibles procesos adicionales y además contemplar la posibilidad de que se ejecuten conexiones a alguna base de datos, reduciríamos el número de conexiones a 250.

Ahora que tenemos nuestro número de conexiones simultáneas máximas, habría que preparar Apache para poder recibir dicho número, lo cual se realiza en el fichero de configuración de este llamado apache2.conf, el cual está alojado en /etc/apache2.

El fichero en cuestión sigue una estructura basada en módulos, cada uno con su nombre correspondiente, pero solamente nos interesaría uno de ellos, cuyo nombre es  mpm_prefork_module. El módulo en cuestión posee los siguientes datos por defecto:

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

Este módulo posee una serie de parámetros muy importantes, aunque hay uno de ellos que nos interesaría especialmente, llamado MaxClients. Dicho parámetro especifica el número máximo de conexiones simultáneas y habría que modificarlo a 250.

Un detalle a tener en cuenta es que cuando se especifica un valor distinto al de por defecto en dicho parámetro, es necesario añadir otro más justo ANTES de éste. Dicho parámetro se denomina ServerLimit y establece el límite de conexiones que podría “aguantar” el servidor aún cuando se encuentra fuera del límite.

El parámetro ServerLimit siempre tiene que ser ligeramente superior al MaxClients y aquí al tener poco margen de maniobra habría que establecer un límite de 270. Esto haría que el módulo quedase de la siguiente forma:

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 270
MaxClients 250
MaxRequestsPerChild 0
</IfModule>

Ahora únicamente faltaría reiniciar el servicio Apache mediante el comando: 

/etc/init.d/apache2 restart

Con esto ya podríamos disfrutar de nuestro servidor web optimizado.

Saludos.



Leave a Reply