PHP-FPM создает слишком много процессов и потребляет всю мощность ЦП

PHP-FPM создает слишком много процессов и потребляет всю мощность ЦП

Это срочный вопрос. Мой экземпляр AWS с 4 ГБ ОЗУ и 2vCPU истощается из-за слишком большого количества процессов 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

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

решение1

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

В 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). Это не скажется на загрузке ЦП или ОЗУ, но сэкономит пропускную способность. Каждый бит помогает на загруженном сервере.

решение2

Я бы проверил, какой у вас процессор. Если вы используете процессоры Graviton, то соотношение CPU и Threads составляет 1 к 1.

т. е. количество ЦП — это то, что вы должны иметь как число pm.max_children. Если вы боитесь утечек памяти или что это повторяющаяся проблема, вы всегда можете использовать эту pm.max_requestsфункцию и установить ее на подходящее значение.

Это значение в некоторой степени основано на том, как быстро растет ваша утечка. Слишком мало, и вы можете время от времени сталкиваться с плохими шлюзами.

Связанный контент