Обложка канала

ServerAdmin.ru

12437 @srv_admin

Авторская информация о системном администрировании.

ServerAdmin.ru

4 года назад
Открыть в
На днях опять упал сайт, на этот раз из-за неправильной настройки php-fpm. Он съел всю память под нагрузкой. Я неправильно понимал значение одного из параметров, плюс мониторинга php-fpm не было. Сейчас уже нормально разобрался, настроил мониторинг. Решил сделать заметку по настройке php-fpm. Для себя и для вас. Php-fpm может работать в трёх режимах: ▪ static - фиксированное количество процессов ▪ dynamic - динамическое управление процессами ▪ ondemand - создание процессов при получении запросов Я чаще всего использую режим dynamic, так как он универсален. Всегда запущены сколько-то процессов (от 1 и более), а их количество поддерживается по заданным правилам. Основные параметры, которые настраиваем для режима dynamic. 📌 pm.max_children - указывает на то, сколько всего процессов php-fpm могут быть созданы. Если ошибётесь и выставите слишком большое число, то вся память веб сервера будет занята и oom killer прибьёт какое-нибудь приложение. Опытным путём необходимо выяснить, сколько в среднем памяти занимает один рабочий процесс php-fpm для вашего сайта, потом прикинуть, сколько памяти можно отдать для всех процессов php-fpm. На основе этого задать параметр. 📌 pm.start_servers - количество процессов, запускаемых при старте php-fpm. Можно начинать с небольших значений в 5-10. Остальные процессы будут создаваться динамически. 📌 pm.min_spare_servers - минимальное количество бездействующих процессов. После того, как нагрузка снизилась, остаются бездействующие процессы. Этот параметр определяет, сколько простаивающих процессов будут держаться в запасе на случай, если опять вырастет нагрузка. Создание новых процессов занимает некоторое время, так что наличие простаивающих процессов немного ускоряет обработку новых запросов. В зависимости от посещаемости и всплесков запросов следует выставить этот параметр. 📌 pm.max_spare_servers - максимальное количество бездействующих процессов. Если доступно больше свободных процессов, чем здесь задано, лишние будут завершены. То есть количество простаивающих процессов будет всегда в интервале описываемых spare параметров. 📌 pm.process_idle_timeout - время простоя, по истечении которого бездействующий процесс будет завершён. Поясню, какой логики надо придерживаться при настройке php-fpm. Если у вас несколько сайтов, то для безопасности каждому сайту лучше создавать отдельного системного пользователя и от его имени запускать отдельный php-fpm пул. Именно в таких ситуациях имеет смысл использовать режим dynamic, так как это компромисс между максимально быстрым и затратным по памяти режимом static и более медленным, но экономным по памяти режимом ondemand. Если у вас один сайт, один пул, то вы можете точно рассчитать максимально возможное количество памяти под php-fpm и сразу выставить максимальное число процессов. Это самый производительный вариант, так как время на создание новых процессов во время обработки запросов не тратится. У вас всё статично. Если сайты не очень нагруженные, их много, и нет желания выжать максимальное быстродействие, то используйте режим ondemand. Процессы будут создаваться только под запросы, использование памяти минимальное, так как ничего не держится в запасе. Режим dynamic позволяет сбалансировать работу нескольких пулов, так как не все сайты на веб сервере одновременно испытывают максимальную нагрузку. Параметрами этого режима можно сделать так, что в случае надобности каждый отдельный сайт сможет получить максимально возможное количество ресурсов под процессы php-fpm, но при этом остальные сайты останутся со своими минимально допустимыми ресурсами. При неудачном раскладе и повышенной нагрузке на несколько сайтов всем памяти может не хватить. Ещё несколько параметров, про которые тоже надо не забыть. user = site01_user group = site01_user listen = /run/php/site01.ru.sock slowlog = /var/log/php-fpm/site01.ru.log php_value[session.save_path]  = /sites/site01.ru/php_session #webserver #phpfpm