¿Cómo investigar una pérdida de memoria con Apache y PHP?

16

Estamos ejecutando un sitio web pesado de Drupal que realiza modelos financieros. Parece que nos encontramos con algún tipo de pérdida de memoria dado el hecho de que las horas extra la memoria utilizada por apache crece mientras el número de procesos de apache se mantiene estable:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Sabemos que el problema de memoria proviene de apache / PHP porque cada vez que emitimos un /etc/init.d/httpd reloaduso de memoria disminuye (vea la captura de pantalla anterior y las salidas CLI a continuación):

Antes de recargar httpd

$ gratis
             total de buffers compartidos gratuitos usados ​​en caché
Mem: 49447692 45926468 3521224 0 191100 22609728
- / + buffers / cache: 23125640 26322052
Intercambio: 2097144 536552 1560592

Después de httpd reload

$ gratis
             total de buffers compartidos gratuitos usados ​​en caché
Mem: 49447692 28905752 20541940 0 191360 22598428
- / + buffers / cache: 6115964 43331728
Intercambio: 2097144 536552 1560592

A cada subproceso de Apache se le asigna un PHP memory_limitde 512 MB, lo que explica el alto uso de memoria que representa el bajo volumen de solicitudes, y un max_execution_timede 120 segundos que debería terminar los subprocesos cuya ejecución lleva más tiempo y, por lo tanto, debe evitar el crecimiento constante en el uso de memoria que estamos viendo.

P: ¿Cómo podríamos investigar qué está causando esta pérdida de memoria?

Idealmente, estoy buscando pasos de solución de problemas que pueda realizar en el sistema sin tener que molestar al equipo de desarrollo.

Información adicional:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

Para su información, somos conscientes del problema de intercambio que estamos investigando por separado y no tiene nada que ver con la pérdida de memoria que hemos observado antes de que el intercambio comenzara a ocurrir.

Max
fuente
La última vez que tuve un problema grave de uso de memoria con LAMP + Drupal fue cuando tenía en uso la biblioteca memcached PHP. Después de que lo eliminé, el uso de memoria disminuyó drásticamente. Solo una suposición. Podría escribir una respuesta adecuada para usted un poco más tarde.
Janne Pikkarainen
@ JananPikkarainen: estamos usando la memcachedbiblioteca PHP . Según la página de administración de memcache memcache.php, todo lo que podemos ver es que hemos asignado 5GBa memcache, de la cual 3.3GBse está utilizando. Sería genial si nos puede ayudar más aquí.
Max
Sí, el memcacheddemonio en sí mismo probablemente esté bien. Es la biblioteca de memcache de PHP la que puede o no perder memoria (y, por lo tanto, aumentar el uso de memoria de los procesos de Apache). Mi problema fue hace aproximadamente 1-2 años, por lo que las cosas podrían haberse solucionado después de eso. De todos modos, si memcached no es obligatorio para usted, intente deshabilitarlo por un tiempo y ver si el uso de la memoria de Apache aún crece.
Janne Pikkarainen
¿Cuál es el problema real? ¿Es pobre el rendimiento? Nos está diciendo síntomas sin explicar qué problema se supone que debemos ayudarlo a resolver. (¿Y de qué está hablando este tema de intercambio? ¿Estás intercambiando tanto que impacta el rendimiento?)
David Schwartz
@DavidSchwartz: el problema es que si no reiniciamos httpd, el uso de la memoria sigue creciendo y la caja finalmente se bloquea con algunos mensajes de kernel sin memoria. Las prestaciones son buenas (hasta que el uso de la memoria se acerque al límite de la memoria). Ignora el problema de intercambio.
Max

Respuestas:

12

Sabemos que el problema de memoria proviene de apache / PHP porque cada vez que emitimos un /etc/init.d/httpd reload el uso de memoria cae

No, eso solo significa que está relacionado con el tráfico web. Mencionó que está ejecutando mysql en la caja, presumiblemente administrando datos para el servidor web, podría ser fácilmente el culpable aquí. Al igual que otros servicios que utiliza su webstack que no ha mencionado.

A cada hilo de Apache se le asigna un límite de memoria PHP de 512 MB que explica

No, no lo hace. Está informando un promedio de 7 y un máximo de 25 servidores ocupados; sin embargo, su gráfico de memoria muestra un delta de alrededor de 25 Gb.

Realmente debería comenzar de nuevo con la sintonización básica de HTTP: parece estar ejecutando 256 httpds constantes, pero su uso máximo es de 25, esto es simplemente tonto.

y un max_execution_time de 120 segundos que debería terminar los hilos cuya ejecución lleva más tiempo

No, solo si el hilo de ejecución está dentro del intérprete PHP, no si PHP está bloqueado.

que realiza modelos financieros

(suspiro)

Hubiera sido útil si hubiera proporcionado detalles sobre cómo ha configurado Apache, subproceso o prefork, qué versión, cómo se invoca PHP (módulo, cgi, fastcgi), si está utilizando conexiones persistentes, si utiliza procedimientos almacenados.

Te sugiero que comiences moviendo mysql a una máquina separada y dejes de usar conexiones persistentes (si las estás usando actualmente). Establezca el límite de memoria mucho más bajo y anule esto por script. Asegúrese de tener instalado y configurado el recolector de basura de referencia circular.

symcbean
fuente
2

Probablemente ya resolvió su problema. Como provisional para evitar que el servidor se intercambie / agite, ejecuto el siguiente comando cada hora desde cron:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

No estoy diciendo que esta sea una solución, solo una forma de mantener las cosas en funcionamiento y minimizar el tiempo de inactividad a medida que investiga la causa real de la pérdida de memoria.

Más detalles se pueden encontrar aquí.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/

Patricio
fuente
1

Aparentemente, esta es la forma en que funciona PHP, y si está haciendo bucles largos donde está asignando objetos y quién sabe si los está pasando también por referencia, entonces la única forma de lidiar con esto es después de N solicitudes para cada proceso PHP para detenerlo Si ejecuta PHP como CGI, cada solicitud hace que reaparezca, por lo que no hay pérdida de memoria y la caída del rendimiento podría no ser tan grande. También puede ejecutar fast-cgi, donde, por ejemplo, cada 1000 solicita que se elimine el proceso php-fcgi y se libere memoria, de nuevo sin pérdida de memoria. Si ejecuta PHP como módulo mod_php, puede intentar configurar maxrequests en httpd.conf para ver si ayuda. Intentaría configurar, por ejemplo, 10: si va a funcionar, la caída del rendimiento no será alta, pero no debería haber pérdidas de memoria,

Andrew Smith
fuente
-1

Verifique la memoria en el archivo php.ini global. simplemente no calcule el valor como 1 G, etc. Recomiendo encarecidamente que se ingrese un php.ini local en esa cuenta para no afectar a todo el servidor. Recomendaría establecer el límite global de php.ini en alrededor de 64M, ya que esto suele ser suficiente para la mayoría de las cuentas

verifique también su configuración de apache

Nikhil Babu
fuente