Cómo Optimizar el uso de memoria de Apache 2.4

Optimizar un servidor Apache es una tarea que puede traerte muchos beneficios, principalmente el menor uso de recursos se traduce en un menor costo.

Optimizar el uso de la memoria de Apache Server 2.4 es una tarea que puede traerte muchos beneficios, principalmente el menor uso de recursos se traduce en un menor costo. Por otro lado usar la menor cantidad de recursos con el mayor tráfico posible mejora la experiencia de tus usuarios.

Para lograr lo anterior sólo debes realizar algunos cálculos matemáticos que te permitan saber cual es el punto máximo de eficiencia. Asumimios que estás utilizando Apache con PHP. Para ello realizaremos las siguientes tareas específicas:

1. Define cuanta memoria RAM usar para Apache.

Para la mayoría de los servidores de uso comercial debes determinar si estás en un VPS o en un servidor dedicado, si compartes el servidor con una base de datos o con un cPanel. Con ello debes determinar que porcentaje le dedicarás como máximo a los procesos del servidor Apache. Debes considerar que en estos casos compartidos, la suma de todos los recursos nunca deben consumir más del 80% del RAM total disponible. cPanel y todas sus herramientas instaladas consumen alrededor de 256M de RAM. MySQL/MariaDB depende de muchas variables, pero si vas a compartir el servidor, procura darle a tu base de datos la menos la mitad del RAM disponible. Lo que resta (repito, considerando siempre tus cálculos al 80%) puedes otorgárselo a Apache.

2. Determina el tamaño de tus procesos de Apache 2.4

Una vez determinada la memoria máxima que puedes consumir para Apache, es importante saber cuanto consume cada proceso para posteriormente determinar cuales serán los limites (Max Request Workers) con los que puedes trabajar. Esto es importante porque si excedes tu limite máximo, en caso de un exceso de tráfico o de algún error o proceso corrupto de php, desbordarás la memoria y te será imposible entrar a administrar el servidor.

Para medir el tamaño promedio de tus procesos de Apache 2.4:

ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'

NOTA: Dependiendo de tu distribución de Linux puede que debas cambiar ‘httpd’ (Centos/Fedora) por ‘apache2’ (Debian/Ubuntu)

Ejemplo:

$ ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'
Apache Memory Usage (MB): 4445.64
Average Process Size (MB): 94.5881

En éste caso cada proceso de apache consume en promedio 94.58 MB. Es un tamaño promedio y menor a 128MB lo cual definiría un limite superior de tamaño de procesos de PHP grandes. Lo ideal sería que fueran de alrededor de 64 MB. Si tus procesos son grandes y tus recursos para Apache disponibles tiene memoria limitada busca la manera de adelgazar tu sitio, desde la optimización de tu plantilla, optimizar las imágenes consultas a base de datos, empleo de caches, y elimina los plugins no necesarios.

Hay otros comandos que puedes encontrar en internet y usar para el calculo del tamaño del proceso que son similares pero ésta es la que mas se acerca a la memoria real de consumo y que lo muestra de manera legible. Nótese que ésta cifra es un promedio en tiempo real por lo que constantemente estará variando.

3. Calcular los Max Request Workers

Esta parte es simple. Dividimos la memoria que se determina como disponible entre el tamaño promedio de los procesos de Apache. Básicamente lo que determinaste en el punto 1 entre el calculo del punto 2 y se agrega en la configuración de apache.

Memoria Disponible / Memoria Promedio por Proceso = Max Requests Workers

En Centos/Fedora el archivo está en:

/etc/httpd/conf/httpd.conf

En Debian/Ubuntu:

/etc/apache2/apache2.conf

Dependiendo del MPM que estés utilizando modificaras los Max Requests Workers. Yo sugiero modifiques todos, de esta manera si cambias de MPM no tendrás problemas de desbordamiento de memoria:

En éste ejemplo es cuando usas el MPM Prefork:

<IfModule mpm_prefork_module>
	StartServers          4
	MinSpareServers       20
	MaxSpareServers      40
	MaxClients           200
	MaxRequestsPerChild  4500
</IfModule>

Reinicia Apache:

Centos/Fedora:

$ service httpd restart

opcion 2

$ apachectl restart

opcion 3

$ /sbin/service httpd restart

Debian/Ubuntu:

$ service apache2 restart

4. La optimización de la memoria de Apache y MaxClients: Conclusión

Con las instrucciones aquí mencionadas podrás darle estabilidad a tu servidor Apache, pero sobretodo mejorarás la experiencia de tus usuarios. Si tu proceso es demasiado grande (>128 MB) trata de optimizar el código de tu plantilla o elimina el exceso de plugins. Utiliza caches o instala OPCACHE para optimizar el uso de PHP. Te recomiendo también separar PHP del proceso de Apache mediante el uso de FPM y utilizar Nginx o Varnish como reverse Proxy para despachar tus contenidos estáticos. Todo ello te permitirá dar el mejor rendimiento al menor costo posible.

Te recomendamos visitar cómo optimizar las imágenes en tu servidor

Autor: Luis Delgado

Luis Delgado es cofundador y CEO de G4A, Agencia Digital. Cuenta con una amplia experiencia y trayectoria en temas ejecutivos de internet, desde la administración y optimización de infraestructura, servidores Linux, Apache, NGINX, MySQL hasta el marketing digital, SEO, Social, contenidos, y comercio electrónico.