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:
Sabemos que el problema de memoria proviene de apache / PHP porque cada vez que emitimos un /etc/init.d/httpd reload
uso 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_limit
de 512 MB, lo que explica el alto uso de memoria que representa el bajo volumen de solicitudes, y un max_execution_time
de 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.
memcached
biblioteca PHP . Según la página de administración de memcachememcache.php
, todo lo que podemos ver es que hemos asignado5GB
a memcache, de la cual3.3GB
se está utilizando. Sería genial si nos puede ayudar más aquí.memcached
demonio 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.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.Respuestas:
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.
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.
No, solo si el hilo de ejecución está dentro del intérprete PHP, no si PHP está bloqueado.
(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.
fuente
Probablemente ya resolvió su problema. Como provisional para evitar que el servidor se intercambie / agite, ejecuto el siguiente comando cada hora desde cron:
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/
fuente
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,
fuente
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
fuente