Cómo evitar que PHP-FPM consuma demasiada RAM en Linux


Si ha implementado una pila LEMP (Linux, NGINX, MySQL/MariaDB y PHP), probablemente esté utilizando el proxy FastCGI dentro de NGINX (como un servidor HTTP), para el procesamiento de PHP. PHP-FPM (un acrónimo de FastCGI Process Manager) es una implementación alternativa PHP FastCGI de alto rendimiento y ampliamente utilizada.

Aquí están las guías útiles sobre cómo configurar LEMP Stack en Linux.

  • Cómo instalar LEMP Stack con PhpMyAdmin en Ubuntu 20.04
  • Cómo instalar LEMP Server en CentOS 8
  • Cómo instalar LEMP en el servidor Debian 10

Recientemente, todos nuestros sitios web PHP en uno de nuestros servidores web LEMP se volvieron lentos y finalmente dejaron de responder al iniciar sesión en el servidor. Descubrimos que el sistema se estaba quedando sin RAM: PHP-FPM había consumido la mayor parte de la RAM, como se indica en la siguiente captura de pantalla (miradas: herramienta de monitoreo del sistema).

$ glances

En este artículo, mostraremos cómo evitar que PHP-FPM consuma demasiada o toda la memoria del sistema (RAM) en Linux. Al final de esta guía, aprenderá cómo reducir el consumo de memoria PHP-FPM en un 50% o más.

Reducir el uso de memoria PHP-FPM

Después de investigar un poco en Internet, descubrimos que necesitábamos reconfigurar el administrador de procesos PHP-FPM y ciertos aspectos del mismo para reducir el consumo de memoria de PHP-FPM en el archivo de configuración del grupo.

El grupo predeterminado es www y su archivo de configuración se encuentra en /etc/php-fpm.d/www.conf (en CentOS/RHEL/Fedora) o /etc/php/7.4/fpm/pool.d/www.conf ( en Ubuntu/Debian/Mint).

$ sudo vim /etc/php-fpm.d/www.conf             [On CentOS/RHEL/Fedora]
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf    [On Ubuntu/Debian/Mint]

Busque las siguientes directivas y establezca su valor para que se adapte a su caso de uso. Para las directivas que están comentadas, debe descomentarlas.

pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200

Expliquemos brevemente las directivas anteriores y sus valores. La directiva pm determina cómo el administrador de procesos controlará el número de procesos secundarios. El método predeterminado es dinámico, lo que significa que el número de hijos (procesos hijos) se establece dinámicamente en función de algunas otras directivas, incluida pm.max_children, que define el número máximo de hijos que pueden estar vivos al mismo tiempo.

El administrador de procesos más ideal es el esquema bajo demanda donde no se crean procesos secundarios al inicio, sino que se generan bajo demanda. Los procesos secundarios solo se bifurcan cuando se conectan nuevas solicitudes en función de pm.max_children y pm.process_idle_timeout, que define la cantidad de segundos después de los cuales se eliminará un proceso inactivo.

Por último, pero no menos importante, debemos establecer el parámetro pm.max_requests que define el número de solicitudes que debe ejecutar cada proceso secundario antes de volver a generar. Tenga en cuenta que este parámetro también se puede utilizar como solución para las pérdidas de memoria en bibliotecas de terceros.

Referencia: una mejor forma de ejecutar PHP-FPM.

Después de realizar estas configuraciones anteriores, noté que el uso de RAM ahora está bien en nuestro servidor. ¿Tiene alguna idea que compartir relacionada con este tema o preguntas? Comuníquese con nosotros a través del formulario de comentarios a continuación.