PHP-FPM под нагрузкой
Вопрос
Расскажите, как работает PHP-FPM и как вы настраиваете его под нагрузку.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Мастер-процесс и пулы воркеров, один запрос на воркер, share-nothing
nginx передаёт запросы по FastCGI через сокет
pm.max_children по памяти, режимы static, dynamic, ondemand
pm.max_requests против утечек, request_terminate_timeout против зависаний
Мониторинг: status page, listen queue, slowlog
Отдельные пулы для разных приложений или тяжёлых эндпоинтов
Что могут спросить следом
- Что произойдёт, если все воркеры заняты медленными запросами?
- Почему важны таймауты к внешним API?
Разбор
PHP-FPM это мастер-процесс, который управляет пулами воркеров. nginx принимает HTTP и передаёт PHP-запросы по FastCGI через unix-сокет. Каждый воркер обрабатывает один запрос целиком, после чего всё состояние запроса уничтожается. Значит, одновременно обрабатывается не больше pm.max_children запросов, остальные ждут в очереди сокета.
pm.max_children считаю от памяти: сколько можно отдать PHP, делённое на размер воркера с запасом. На стабильной высокой нагрузке ставлю pm = static, на смешанной dynamic. pm.max_requests в пару тысяч перезапускает воркеры и спасает от медленных утечек, request_terminate_timeout убивает зависшие запросы, а slowlog пишет стек всего, что дольше порога.
Опасная ситуация: внешний API начал отвечать по 30 секунд, и все воркеры заняты ожиданием, сайт перестаёт отвечать. Поэтому у HTTP-клиентов всегда короткие таймауты, а тяжёлое уходит в очереди. Слежу за статус-страницей пула: если listen queue растёт и в логе появляется reached pm.max_children, воркеров не хватает или запросы стали медленными.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.