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

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

0
задан 13 January 2020 в 11:09
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, ваш сервер поменяется местами и производительность будет ужасной. Если вы выделите слишком много CPU, то он будет работать медленнее, но не так плохо, как недостаточное количество оперативной памяти.

В общем, вам следует поработать, сколько 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). Это не скажет о большом количестве процессора или оперативной памяти, но это сэкономит полосу пропускания. Каждый бит помогает на загруженном сервере

.
0
ответ дан 14 January 2020 в 23:33

Теги

Похожие вопросы