¿Cómo puedo sintonizar la asignación de memoria del servidor web Apache para evitar errores de falta de memoria en mi instancia de Linux de EC2?
Mi servidor web Apache que se ejecuta en una instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2) no responde de forma intermitente. Veo mensajes como «memoria insuficiente», «oom», «oom-killer», «error al bifurcar el proceso» u otro tipo de memoria insuficiente en el registro del sistema de la instancia.
Descripción corta
De forma predeterminada, Apache acepta 256 conexiones al mismo tiempo. Utilice el ServerLimit de la configuración de Apache para configurar la cuota.
Los tipos de instancias pequeñas, como t2.small, tienen solo 2 gigabytes (GB) de memoria y no pueden administrar 256 conexiones simultáneas de Apache. Como resultado, es posible que se muestre uno de los siguientes errores cuando el servidor reciba mucho tráfico:
- «Sin memoria»
- «Oom»
- «Oom-killer»
- «Error al bifurcar el proceso»
- Nota sobre la falta de memoria en los registros del sistema
Para analizar los registros del sistema de instancias, compruebe los siguientes archivos de registro según la distribución de su sistema operativo (SO):
- Para Debian y Ubuntu, consulte /var/log/syslog.
- Para Amazon Linux, CentOS y Red Hat Enterprise Linux (RHEL), consulte /var/log/messages.
Resolución
Para evitar errores de memoria en la instancia, establezca una cuota para el número de conexiones simultáneas de Apache y httpd que acepta el servidor. Utilice el parámetro MaxRequestWorkers (Apache 2.4) en la configuración de Apache para establecer la cuota. Para los servidores Prefork sin subprocesos, MaxRequestWorkers representa la cantidad máxima de procesos secundarios que Apache inicia para las solicitudes del servidor.
La siguiente resolución es para el modelo predeterminado de módulo multiprocesamiento (MPM) de Apache de Prefork que utilizan los servidores web. Para confirmar el MPM, ejecute el siguiente comando:
# apachectl -V | grep "MPM"
Para calcular el valor aproximado que se va a establecer para MaxRequestWorkers, determine en qué medida su carga de trabajo utiliza la siguiente configuración:
- La RAM física del servidor
- La memoria que queda después de que otros servicios usen la memoria
- El proceso de Apache que usa más memoria
Nota: Se recomienda utilizar un intervalo del 90 al 100 % de RAM RESTANTE para MaxRequestWorkers a fin de equilibrar el rendimiento y la estabilidad del servidor. Sin embargo, su carga de trabajo puede tener otras necesidades.
Cálculo de la RAM física del servidor
Para calcular la RAM, ejecute el siguiente comando:
# free -m | grep Mem: | awk '{print $2}'
Cálculo de la memoria que queda después de que otros servicios usen la memoria
Primero, calcule el uso de memoria de todos los servicios principales que no sean Apache. Ejecute el siguiente comando para cada servicio:
# usage_mbytes=0; for usage_by_pids in `ps -C $proc_cmd -o rss | grep -v RSS`; do usage_mbytes=$(($usage_mbytes + $usage_by_pids)); done; echo $(($usage_mbytes/1024)) MB;
Nota: En el comando anterior, sustituya $proc_cmd por el nombre del servicio o el comando. Por ejemplo, use mysqld para calcular el uso de memoria del servicio mysqld.
Después de calcular el uso de memoria de cada servicio, suma los valores para obtener la suma total del uso de memoria de todos los demás servicios principales.
A continuación, utilice la siguiente fórmula para restar el uso de memoria de todos los demás servicios principales de la RAM física del servidor en megabytes (MB):
Memoria restante = (RAM física del servidor) - (Uso de memoria por parte de todos los demás servicios principales)
Identificación del proceso de Apache que utiliza la mayor cantidad de memoria
Para identificar el proceso que utiliza más memoria, ejecute el siguiente comando:
# sudo bash -c 'high_mem=0; for pid in $(ps aux | grep -E "httpd|apache2" | grep -v ^root | awk "{print \$2}"); do memory=$(pmap -d $pid | grep "writeable/private" | awk "{print \$4}" | sed "s/[^0-9]//g"); if [[ $memory -gt $high_mem ]]; then high_mem=$memory; fi; done; echo $((high_mem/1024)) MB'
Tenga en cuenta la cantidad de memoria que utiliza el proceso.
Cálculo de MaxRequestWorkers
Utilice la fórmula siguiente para calcular MaxRequestWorkers:
MaxRequestWorkers = (Memoria restante * 90/100)/(Memoria consumida por el proceso más grande de Apache)
Nota: Sustituya Memoria restante por la memoria que queda después de que otros servicios usen la memoria y Memoria consumida por el proceso más grande de Apache por la memoria que usa el proceso más grande.
El cálculo anterior es el mismo para los sistemas basados en Ubuntu, Debian y RHEL. Sin embargo, la ruta de configuración de Apache y los nombres de archivo dependen del tipo de sistema operativo. Configure MaxRequestWorkers en función de su sistema operativo.
Nota: Los siguientes ejemplos utilizan una versión 2.4 o posterior de Apache.
Debian y Ubuntu
Siga estos pasos:
-
Para abrir el archivo /etc/apache2/mods-available/mpm_prefork.conf en el modo editor, ejecute el siguiente comando:
# vi /etc/apache2/mods-available/mpm_prefork.conf -
Cambie el parámetro MaxRequestWorkers por el valor que ha calculado.
Ejemplo:<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>Nota: Sustituya your_value por el valor de MaxRequestWorkers calculado. Además, configure los demás parámetros para que se ajusten a sus requisitos.
-
Guarde el archivo y, a continuación, salga del archivo.
-
Ejecute el siguiente comando para realizar una comprobación de la sintaxis de Apache:
# apachectl configtest -
Si recibe un resultado de sintaxis correcta, ejecute el siguiente comando para reiniciar Apache:
# systemctl restart apache2
Amazon Linux, CentOS y RHEL
Siga estos pasos:
-
Cree un archivo con la ruta /etc/httpd/conf.d/mpm_prefork.conf y, a continuación, agregue el siguiente bloque de comandos:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers your_value MaxConnectionsPerChild 0 </IfModule>Nota: Sustituya your_value por el valor de MaxRequestWorkers calculado. Además, configure los demás parámetros para que se ajusten a sus requisitos.
-
Guarde el archivo y, a continuación, salga del archivo.
-
Ejecute el siguiente comando para comprobar la sintaxis de configuración de Apache:
# httpd -t -
Si recibe un resultado de sintaxis correcta, ejecute el siguiente comando para reiniciar Apache:
# systemctl restart httpd
Información relacionada
Tutorial: instalación de un servidor LAMP en Amazon Linux 2
Tutorial: instalación de un servidor LAMP en Amazon Linux 2023
- Temas
- Compute
- Etiquetas
- LinuxAmazon EC2
- Idioma
- Español

Contenido relevante
- preguntada hace 3 días
- preguntada hace 12 días
- Respuesta aceptadapreguntada hace 4 meses
- preguntada hace 8 meses