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