Поиск по сайту:

Как предотвратить потребление PHP-FPM слишком большого количества оперативной памяти в Linux


Если вы развернули LEMP (Linux, NGINX, MySQL/MariaDB и PHP) стек, то вы, вероятно, используете проксирование FastCGI внутри NGINX (в качестве HTTP-сервера) для обработки PHP. PHP-FPM (аббревиатура от FastCGI Process Manager) — это широко используемая и высокопроизводительная альтернативная реализация PHP FastCGI.

Вот полезные руководства по настройке LEMP Stack в Linux.

  • Как установить стек LEMP с помощью PhpMyAdmin в Ubuntu 20.04
  • Как установить сервер LEMP на CentOS 8
  • Как установить LEMP на сервер Debian 10

Недавно все наши веб-сайты PHP на одном из наших веб-серверов LEMP стали работать медленно и в конечном итоге перестали отвечать при входе на сервер. мы обнаружили, что системе не хватает оперативной памяти: PHP-FPM израсходовал большую часть оперативной памяти, как показано на следующем снимке экрана (взгляд – инструмент мониторинга системы).

glances

В этой статье мы покажем, как предотвратить потребление PHP-FPM слишком большого количества или всей системной памяти (RAM) в Linux. В конце этого руководства вы узнаете, как сократить потребление памяти PHP-FPM на 50 % и более.

Уменьшите использование памяти PHP-FPM

Проведя небольшое исследование в Интернете, мы обнаружили, что нам необходимо перенастроить диспетчер процессов PHP-FPM и некоторые его аспекты, чтобы уменьшить потребление памяти PHP-FPM в файле конфигурации пула.

Пулом по умолчанию является www, а его файл конфигурации находится по адресу /etc/php-fpm.d/www.confCentOS/RHEL/Fedora) или /etc/php/7.4/fpm/pool.d/www.confUbuntu/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]

Найдите следующие директивы и установите их значение в соответствии с вашим вариантом использования. Если директивы закомментированы, вам необходимо их раскомментировать.

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

Давайте кратко объясним приведенные выше директивы и их значения. Директива pm определяет, как менеджер процессов будет контролировать количество дочерних процессов. Метод по умолчанию — dynamic, что означает, что количество дочерних процессов (дочерних процессов) устанавливается динамически в зависимости от некоторых других директив, включая pm.max_children, который определяет максимальное количество дочерних процессов, которые может быть одновременно живым.

Наиболее идеальным менеджером процессов является схема ondemand, при которой дочерние процессы не создаются при запуске, а создаются по требованию. Дочерние процессы разветвляются только тогда, когда новые запросы будут подключаться на основе pm.max_children и pm.process_idle_timeout, которые определяют количество секунд, по истечении которых простаивающий процесс будет завершен.

И последнее, но не менее важное: нам нужно установить параметр pm.max_requests, который определяет количество запросов, которые каждый дочерний процесс должен выполнить перед повторным созданием. Обратите внимание, что этот параметр также можно использовать в качестве обходного пути для устранения утечек памяти в сторонних библиотеках.

Выполнив указанные выше настройки, я заметил, что использование ОЗУ на нашем сервере теперь в порядке. Есть ли у вас какие-либо мысли по этой теме или вопросы, которыми вы можете поделиться? Свяжитесь с нами через форму обратной связи ниже.