uso de memoria httpd

13

Tener algunos problemas con el uso de la memoria httpd( Apache/2.2.29).

Con el tiempo, el uso de memoria en los httpdprocesos aumenta progresivamente hasta que finalmente es del 100%.

La última vez que reinicié httpdfue hace unas 24 horas. Salida de free -mes:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Para demostrar que es definitivamente httpd, reinicié httpdy corrí free -mnuevamente:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Entonces, reiniciar Apache requiere memoria libre de 239 Mb a 894 Mb, lo que parece un gran salto.

He estado revisando la lista de módulos de Apache actualmente habilitados (hay muchos) y deshabilitado / eliminado mod_wsgiy mod_perl(ninguno de los cuales son necesarios para este servidor, que ejecuta una aplicación web basada en PHP, específicamente Magento).

Basado en https://servercheck.in/blog/3-small-tweaks-make-apache-fly , ejecuté y obtuve ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'el siguiente resultado:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

Al ejecutar la otra herramienta de diagnóstico sugerida para la MaxClientscual se ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'devuelve lo siguiente:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Este servidor ( m1.smallinstancia de Amazon AWS ) tiene 1.7 GbRAM. Asi que, por lo tanto:

¿Alguna otra sugerencia / sugerencia sobre cómo ajustar mejor la httpdconfiguración o cómo diagnosticar qué podría estar causando esto?

James Spittal
fuente
Tenga en cuenta que para verificar el uso de memoria por procesos, debe mirar la -/+ buffers/cachelínea; Sin embargo, en este caso el cambio es comparable. Dependiendo de cómo se haya ajustado Apache, puede comenzar con solo un par de procesos listos para manejar solicitudes; Después de un período de muchas solicitudes concurrentes, probablemente habrá más procesos bifurcados para manejar la carga. El número de procesos inactivos también se puede ajustar. Entonces, si apache crece para usar demasiada memoria, necesita hacer algunos ajustes.
wurtel
Estoy bien con la configuración del servidor Apache, pero no he hecho una gran cantidad en términos de ajuste de rendimiento para Apache en el pasado. ¿Alguna sugerencia sobre qué directivas debería mirar o guías? ¿Hay alguna configuración que pueda habilitar para decirle a Apache que elimine los procesos bifurcados después de un cierto tiempo? (Parece que Apache no hace esto por defecto por alguna razón.)
James Spittal
Esta es la razón exacta por la que me he alejado de Apache ... prueba Nginx o incluso Lighttpd.
Interesante. Escuché cosas buenas, nginxasí que tal vez es hora de que lo intentemos, pero honestamente, he estado usando Apache durante años y nunca tuve ningún problema importante. Sin embargo, Magento realmente mastica la memoria.
James Spittal
Tenga en cuenta que su script para calcular el uso promedio de memoria incluye el uso bajo de memoria del grep httpdproceso (al menos para mí). Para solucionarlo, recomendaría excluir esa línea del cálculo de esta manera:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

Respuestas:

11

Esto es lo que he hecho para 'resolverlo':

  1. Conjunto MaxClients 7(basado en (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Por lo tanto:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Desactivar todos los módulos de Apache a excepción de authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Elimine el mod_sslpaquete ya que el cliente no está usando https://nada.

Informaré una vez que esta nueva configuración se haya estado ejecutando durante un tiempo para ver si esto la resuelve.

Un poco de inspiración aquí fue tomada de: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ y http://www.activoinc.com/ descargas / httpd.conf-magento

James Spittal
fuente
La configuración anterior definitivamente ha ayudado masivamente.
James Spittal
1
Un par de días después, los problemas de "pérdida de memoria" httpdparecen haber desaparecido por completo.
James Spittal
2

Me temo que la opción MaxRequestsPerChild ayudó en su caso, ya que permite el reciclaje del proceso después de un número definido de solicitudes, por lo que la pérdida de memoria está allí, pero ya no es visible.

Además: MaxClients = ServerLimit * ThreadsPerChild

En su caso, si necesita solo 7 usuarios simultáneos (MaxClients = 7), es totalmente suficiente con 2 procesos (solo en caso de que uno no pueda minimizar el tiempo de inactividad), por lo que la configuración puede ser:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Utilizo MaxClients 8 , solo para hacer una distribución de solicitud más equitativa entre 2 procesos.

Igor Levkov
fuente