Назад | Перейти на главную страницу

PHP-FPM создает слишком много процессов и съедает весь процессор

Это актуальный вопрос. Мой экземпляр AWS с 4 ГБ ОЗУ и 2 виртуальными ЦП исчерпывается из-за слишком большого количества процессов php-fpm.

PHP-FPM начинает создавать слишком много процессов, чего не делал раньше. Это приводит к медленной загрузке сайта. Я не могу понять, почему это происходит.

Моя конфигурация php.ini:

html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M 
upload_max_filesize = 27M 
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M

www.conf:

pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

снимок экрана верхней команды:

Отвечая на ваш вопрос

В www.conf измените это (35 процессов)

pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

к этому (8 процессов) - или любое другое число, которое вам нравится

pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000

Вы также можете исправить эту опечатку

max_file_uploads = 20 = 20

Отвечая на вопрос в комментариях

В качестве фона pm.max_children указывает количество потоков PHP, доступных для запросов на обслуживание. Если поток недоступен, запрос будет стоять в очереди до тайм-аута веб-сервера, пока работа не станет доступной.

PHP очень интенсивно использует память и довольно загружает процессор. Если у вас достаточно ОЗУ (скажем) 10 потоков PHP, но выделено 30, ваш сервер поменяется местами, и производительность будет ужасной. Если вы перераспределите процессор, он будет работать медленнее, но это будет не так плохо, как недостаток оперативной памяти.

В общем, вы должны определить, сколько PHP-воркеров может работать, не исчерпывая ОЗУ серверов. Допустим, ваш сервер использует 2 ГБ ОЗУ с выключенным PHP, и каждый поток использует 100 МБ ОЗУ, у вас может быть около 20 рабочих PHP. Вам следует избегать перенасыщения ОЗУ, поскольку она используется в качестве дискового кеша, поэтому оставьте немного ОЗУ свободной.

Вам нужно найти баланс между медленными потоками PHP и очередями. Никто не может сделать это за вас, это будет эксперимент, пока ваш сервер не будет полностью загружен, но не будет проблем. Но для начала предположим, что максимум 10 потоков и оттуда пойдем. Используйте «top» для мониторинга свободной памяти, но для памяти вам может потребоваться использовать столбец «res» (я полагаю, находится в памяти) вместо «virt» для оценки использования оперативной памяти PHP.

Opcache

Я подозреваю (но не знаю наверняка), что совет по включению opcache устарел, поскольку PHP7 довольно хорошо оптимизирован и, вероятно, включен по умолчанию.

Кеширование

Ключ к хорошей производительности PHP - это кеширование. Анонимные пользователи, попадающие на страницу, которая не настроена, часто могут быть кэшированы, даже если это всего лишь на 1/5/60 секунд, это может быть большим подспорьем на сильно загруженном сервере. Убедитесь, что заголовки кеширования правильно описывают истечение срока действия страницы, затем настройте Nginx / Apache для кеширования соответствующим образом - если вы используете веб-сервер.

Вы также можете кэшировать статические ресурсы в CDN, например CloudFront / CloudFlare (обратите внимание, что CloudFlare имеет бесплатный уровень и хорошо работает с AWS). Он не скажет много CPU или RAM, но сэкономит пропускную способность. Каждый бит помогает на загруженном сервере.