Sé que la pregunta es un poco larga pero elegí describir todos y cada uno de los aspectos que observé por mi parte.
Estoy usando un servidor Linux, el sistema operativo utilizado es Ubuntu 14.04, todas las demás configuraciones se definen a continuación. Este servidor web se utiliza para servir aplicaciones creadas en PHP, la base de datos está alojada en RDS. En promedio, en las horas pico hay casi 200 solicitudes simultáneas en el servidor, lo que termina en una utilización de la memoria del 100%. Debido a esta aplicación se vuelve muy lenta o a veces responde con error. Así que seguí algunos pasos para resolver esto, que enumero a continuación, e intenté ajustar Apache y restringirlo para situaciones extrañas.
SO
NOMBRE="Ubuntu" VERSIÓN="14.04.5LTS
Configuración del servidor
CPU: 8 núcleos
RAM: 15 GB
Proveedor de hardware: AWS
Tipo de instancia: c4.2xlarge
Parámetros de Apache.Conf (2.4)
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Búsquedas de nombre de host desactivadas
LogLevel advierte
AllowOverride all (para la raíz del documento de la aplicación)
MPM UTILIZADO: prefork
MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200
Mods_Enabled
access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf negociación.conf ssl.load authn_file. cargar dir.cargar negociación.cargar estado.conf authz_core.cargar env.cargar php5.conf estado.cargar authz_host.cargar filtro.cargar php5.cargar authz_user.cargar encabezados.cargar reescribir.cargar autoindex.conf mime.conf setenvif.conf
Tamaño promedio del proceso Apache
Comando utilizado:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>
Uso de memoria de Apache (MB): 7227,66
Tamaño promedio del proceso (MB): 314,246
Cálculo de MaxRequestWorkers
X = RAM dedicada que quiero asignar a Apache (13 GB): 13312 MB
Y = Tamaño promedio del proceso que estoy monitoreando durante los últimos 15 días en el servidor: 314.246
MaxRequestWorkers = X/Y = 40 aproximadamente
MPM UTILIZADO: prefork
MPM_PREFORK.CONF modificado
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 40
MaxConnectionsPerChild 8
Ahora, cuando se inicie Apache, iniciará 5 procesos de inicio de servidores y cada proceso de inicio de servidores iniciará 8 conexiones secundarias, por lo que se pueden realizar un total de 40 conexiones simultáneas al servidor. MaxRequestWorkers está limitado a 40, lo que no superará las 40 solicitudes simultáneas, lo que evitará que, en caso de DOS, DDOS o el servidor protegido, se detenga al ocupar un máximo de 13 GB de RAM, dejando 2 GB de RAM libres para el servidor.
Tampoco tengo claro el parámetro MaxConnectionsPerChild; por favor, corrijame si lo estoy usando incorrectamente.
Parámetros de PHP.INI (php5)
ANTIGUO
buffer_salida = 4096
max_execution_time = 60
Memory_limit = -1
log_errors = activado
NUEVO
Output_buffering = 4096
max_execution_time = 60
Memory_limit = 64M
log_errors = activado
PROBLEMAS QUE AÚN ENFRENTO
Después de cambiar mpm_prefork_conf, la utilización de la memoria disminuyó, pero el servidor responde con un error 503 a muchos clientes debido al parámetro MaxRequestWorkers. Intenté descubrir por qué cada proceso de Apache utiliza 315 MB de RAM, busqué en Google alrededor de 2 días y no pude encontrar la ruta correcta para solucionar el problema. Finalmente publiqué esto aquí. Tengo dos opciones ahora.
Para optimizar el límite de proceso promedio de Apache y aumentar el límite de MaxRequestWorkers.
Aumentar la RAM y atender a clientes con el mismo tamaño de proceso promedio, lo cual creo que no sería una opción correcta.
Por favor guíenme con las sugerencias correctas sobre cómo puedo identificar y reducir el tamaño promedio del proceso de Apache con PHP. Por favor solo respuestas genuinas.
Respuesta1
No creo que puedas conseguir algo mejor que esto. Yo tomaría la ruta de usar php-fpm, entonces la carga de contenido no dinámico será mucho más rápida y consumirá menos memoria. He encontrado esto.guía (digitalocean.com), que da buenas recomendaciones. Una cosa que podrías comprobar es cambiar los tiempos de mantenimiento de actividad en Apache.aquí
Respuesta2
Eso es bastante memoria por proceso de Apache. Y Ubuntu 14.0.4 finalizó su vida útil en 2019.
Lo que grita en la configuración que publicaste es esto:
KeepAliveTimeout 5
Cambie eso a 1. Descubrirá que al menos la mitad de sus procesos activos actualmente no hacen nada esperando el tiempo de espera de mantenimiento de actividad.
Comience a analizar su tráfico: asegúrese de que todo su contenido estático se pueda almacenar en caché.
Revise su configuración de Apache; asegúrese de no cargar módulos que no esté utilizando.
Asegúrese de haber establecido una hora predeterminada para PHP y que sus scripts no deshabiliten el informe de errores. Verifique sus registros de errores y borre los errores. Intente modificar su lista de escucha en Apache.
Conexiones máximas por niño 8
¿Por qué? Esto esmuybajo. Apache es generalmente muy estable. Debería poder aumentar esto a 100 para reducir la cantidad de veces que Apache necesita bifurcarse y, por lo tanto, aumentar la capacidad. Si cambiar este valor tiene un impacto en las tasas de error de la aplicación, verifique que no tenga conexiones de bases de datos persistentes mal codificadas. Si afecta el uso de la memoria, asegúrese de que sus parches estén actualizados.