9 votos

Nginx + php-fpm - Cada php-fpm proceso de 70-100% de la cpu cuando se ejecuta

Estoy en una situación en la cual se lleva a cabo:

  • Estamos en linode con 8 núcleos, 8 gb de ram , 2.6 ghz - utilizar nginx + php-fpm - estamos recibiendo muy alto de los gráficos de uso de cpu (que no queremos ser una mala VPS vecino)...

  • Tenemos alrededor de menos de 100 usuarios en el sitio, en un tiempo - por lo que esta situación también es muy vergonzoso - que nuestro uso de la cpu es muy alto.

  • Estamos usando un desconocido, posiblemente de la cpu php-sabio, dudosamente horrible Framework en lugar de un bien conocido, bien documentado, bien elaborados que otros frameworks como wordpress o drupal en el que hay un MONTÓN de documentación sobre el almacenamiento en caché (así como los plugins que se encargan de almacenamiento en caché) php en un nginx + php_fpm de la plataforma.

  • Por lo tanto, tenemos cerca de 6 abra php-fpm procesos que cuando se EJECUTA, consumir de forma individual GRANDE (+de 30, y a menudo cerca del 99%) de los importes de la cpu, y yo realmente no la más mínima idea de cómo dejar de usar tanta cpu. Yo no puedo decir que los scripts php están causando estos picos porque están sucediendo todo el tiempo... normalmente sólo 1 o 2 se ejecutan, pero cuando todos los 6 ejecutar maximizar los 8 cpus.

  • Mi piscina.d/www.conf archivo tiene la siguiente configuración:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • Hicimos esto ^ la instalación debido a que, en la forma en que estoy interpretting, nuestra memoria es realmente increíble (htop mostrando 472/7000+mb usados, no intercambio, etc) y podemos manejar muchos más procesos y romper la línea de espera para obtener procesados - PERO, por desgracia, ya que cada proceso es demasiado intenso en nuestro cpu cuando se ejecuta - terminamos la conducción de nuestra CPU a través del techo por lo que no puede manejar los procesos.

  • La pregunta - ¿qué podemos hacer para reducir el proceso de php-fpm uso de la cpu, de modo que podemos aumentar la configuración de la piscina conf archivo de php-fpm - y también sí, el /var/log/php5-fpm.registro nos está gritando para aumentar nuestros niños y ajustar o aumentar nuestros min/max/start servidores. Pero al hacerlo hace que nuestro promedio de carga loco como se ha indicado anteriormente. ¿Cómo podemos hacerlo sin que necesariamente el uso de una caché o ¿cuáles son nuestras opciones?

  • Mi idea? He leído cosas sobre el uso de cpulimit para asegurarse de que ningún proceso se lleva más de un importe adjudicado de la cpu, pero se que las cosas más despacio a ser inutilizable? O al hacerlo podríamos aumentar nuestra capacidad de ejecutar más de un par de procesos - también pensé en correr dos piscinas - una para nuestra mirando hacia adelante sitio web (lo que la experiencia de los clientes) y otro para un backend (que está afectando a nuestra mirando hacia adelante sitio cuando el tiempo que consumen los informes se ejecutó).

  • He estado pasando unos días investigando, buscando en google, etc sobre este tema - y es difícil porque la situación de cada uno es tan único en su sistema - el problema es estar en un específico desconocido, posiblemente mal escrito - marco - es lo que es difícil encontrar una solución. No podemos chatarra de este marco todavía - tengo que encontrar una solución de algún tipo.


ACTUALIZACIÓN: me han implementado memcache para almacenar php - porque el marco de trabajo depende en gran medida de las sesiones de usuario y la naturaleza de nuestro sistema es que los empleados suelen utilizar varias pestañas a la vez - cada comprobación posterior a las sesiones para confirmar habilidades / datos de usuario de / etc... así que estoy esperando a ver algunos de aumento en el rendimiento de este - bienvenido a comentar que si usted quisiera - voy a ver cómo nos va mañana cuando lleguemos a través de nuestro mayor volumen de horas pico.

6voto

Rouben Puntos 409

Un par de cosas a tener en cuenta (disculpas de antemano si ya han considerado que estos): Primero de todo, asegúrate de optimizar su nginx config e invocar php-fpm sólo cuando sea absolutamente necesario. La última cosa que quiero hacer es dejar de php manejar las cosas como páginas HTML estáticas (que estará encantado de hacer).

En segundo lugar, ya que usted está utilizando php-fpm, me sugieren para ser más agresivo con cuánto tiempo de php-fpm los niños se les permite vivir. Usted necesita encontrar el punto dulce entre poco vivido hilos/de los niños y la estabilidad. El php-fpm valores predeterminados manera generosa para cualquier sistema de producción, en mi humilde opinión. El tiempo que un trabajador se le permite el acabado de las solicitudes, más inestable será. También hay un mayor riesgo de fugas de memoria, y si este marco se refieren a errores como los bucles infinitos, lo que puede estar causando el dolor con la carga de la CPU, esto no debería doler.

Me gustaría reducir el número de pm.max_requests para su producción piscinas. Creo que el valor predeterminado es 200. Me gustaría empezar a partir de los 50 y a ver a dónde te lleva.

Fallando/complementaria, también se podría tratar de estas opciones globales (AFAIK todos ellos están deshabilitados de forma predeterminada):

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

¿Qué significa esto? Si 3 de PHP-FPM hijo procesos de salir con SIGSEGV o SIGBUS (es decir, crash) dentro de 1 minuto, a continuación, PHP-FPM se supone que se reinicie automáticamente. El niño los procesos de esperar 5s para una reacción en las señales de la maestra.

Aquí un buen resumen de todas las opciones de configuración que he mencionado aquí, así como los demás: http://myjeeva.com/php-fpm-configuration-101.html

Espero que estos consejos le ayudará! Recuerde ajustar y observar, por desgracia, no parece ser una regla de oro para todo esto, como usted observa, hay demasiadas variables que afectan de PHP, el comportamiento y la estabilidad.

Finalmente, la limitación de CPU se preguntó acerca de está documentado aquí, pero me gustaría recurrir a ella si le escape de cada opción. Si elige este camino, me volvería a mirar hacia fuera para las posibles interacciones entre PHP-FPM ajustes y sus límites.conf configuración. En ese punto etckeeper puede ser un salvavidas! :)

Buena suerte!

Rouben

3voto

Michael Hampton Puntos 88271

Está ejecutando el código de operación de almacenamiento en caché, haga?

Lo que solía ser la APC que fue el ir a aquí, pero ha sido un buggy pieza de bastante tiempo, y ha sido sustituida por la de Zend Opcache, que ahora es parte de PHP desde 5.5, y tiene un backport en los PECL para la 5.3 y 5.4.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X