Ответ вслух Senior Производительность: OPcache и FPM обновлено

PHP-FPM под нагрузкой

Вопрос

Расскажите, как работает PHP-FPM и как вы настраиваете его под нагрузку.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

PHP-FPM это мастер-процесс, который управляет пулами воркеров. nginx принимает HTTP и передаёт PHP-запросы по FastCGI через unix-сокет. Каждый воркер обрабатывает один запрос целиком, после чего всё состояние запроса уничтожается.

Что должно прозвучать в ответе

  • Мастер-процесс и пулы воркеров, один запрос на воркер, 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 ошибок.