Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры5

Процессор свободен, а PHP-запросы ждут: как увидеть очередь PHP-FPM

Проверяем конкретный пул PHP-FPM во время замедления: какие показатели сопоставить, почему свободный CPU не исключает ожидание и что делать, если очередь пустая. С воспроизводимым учебным расчётом.

Комментарии 0

Схема ожидания запросов перед четырьмя процессами PHP-FPM на синем и оранжевом фоне.
В этой статье

Карточка товара открывается несколько секунд, а средняя загрузка процессора остаётся небольшой. Это ещё не доказательство, что серверу хватает ресурсов. Динамический запрос может ждать свободный процесс PHP-FPM; уже занятые процессы в это время могут ожидать базу или внешний сервис.

Я бы начала с более узкого вопроса: стояли ли запросы в очереди именно того пула PHP, который обслуживает магазин, в момент задержки? Ни процент CPU, ни одно старое максимальное значение сами по себе на него не отвечают.

Сначала отделите ожидание процесса от выполнения кода

Пул — группа процессов PHP-FPM. Свободный процесс принимает запрос, занятый обслуживает предыдущий. Если свободных процессов нет, запросы могут ждать перед пулом. Такой участок задержки отличается от времени, которое уже получивший запрос процесс тратит на работу приложения.

Путь динамического запроса через веб-сервер, очередь FPM и процесс PHP к базе или внешнему API.
Схема разделяет ожидание свободного процесса и выполнение запроса. Она не показывает фактические задержки магазина.

Среднее значение CPU по серверу способно скрыть нагрузку отдельного ядра. Обратная ситуация тоже возможна: процесс PHP занят запросом, но большую часть времени ждёт ответ другой системы. Поэтому свободный процессор не равен свободному пулу.

Настройка pm.max_children ограничивает число одновременно обслуживаемых запросов. Для статического режима она задаёт число процессов, для динамического и запуска по требованию — верхнюю границу. Это описано в документации конфигурации PHP-FPM. Из этих правил не следует, что лимит нужно сразу увеличивать.

Что попросить у администратора во время замедления

Если статус FPM уже собирается внутренним мониторингом, возьмите данные оттуда. Иначе попросите администратора подготовить доступ только для разрешённых внутренних запросов. Статус содержит сведения о ресурсах и запросах: открывать его всем посетителям сайта ради проверки не нужно.

Смысл полей можно сверить с официальным описанием страницы статуса FPM. Для начала достаточно следующих значений:

Поле

Как использовать

pool

Проверить, что выбран пул магазина.

listen queue

Текущее ожидание свободного процесса.

idle processes / active processes

Сколько процессов свободно и занято в этом снимке.

max listen queue

Исторический максимум; не текущая очередь.

max children reached

Был ли достигнут предел; старое значение не датирует нынешний сбой.

start time / start since

Обнаружить перезапуск между измерениями.

Сохраните несколько снимков в течение самого замедления и один после него. Рядом запишите время с часовым поясом, затронутый маршрут магазина, время ответа и ошибки за тот же интервал. Эти данные относятся к одному пулу; после перезапуска FPM его значения сбрасываются.

Для запроса администратору достаточно такой формулировки: «Во время медленного открытия карточки проверьте пул этого сайта: есть ли текущая очередь, остаются ли свободные процессы и достигается ли настроенный предел. Сохраните показатели вместе со временем ответа, чтобы сравнить их на одной шкале». Это запрос на наблюдение, а не на изменение конфигурации.

Учебная проверка: почему четыре процесса не всегда успевают

Чтобы проверить арифметику, при подготовке статьи мы выполнили отдельный расчёт непрерывного потока. В нём четыре процесса, равномерный вход 10 запросов в секунду, начальная очередь нулевая. Один запрос занимает процесс 0,5 секунды. Идеальная пропускная способность тогда равна 4 / 0,5 = 8 запросам в секунду, а очередь растёт на 2 запроса в секунду.

Расчёт дал 10 ожидающих запросов через 5 секунд и 20 через 10. Во втором варианте мы сохранили четыре процесса и тот же вход, но сократили занятость на запрос до 0,25 секунды. Расчётная способность стала 16 запросов в секунду, и очередь в этой модели не росла.

График расчётной очереди: при длительности 0,5 секунды она растёт от нуля до двадцати, при 0,25 секунды остаётся нулевой.
Выполненный учебный расчёт непрерывного потока. Это не замер PHP-FPM, не тест магазина и не история клиента.

Проверку можно повторить в Python 3. Следующие строки выводят две расчётные длины очереди для каждого момента:

workers, incoming = 4, 10

for seconds in (0, 5, 10):

queues = [max(0, (incoming - workers / hold) * seconds) for hold in (0.5, 0.25)]

print(seconds, queues)

Вывод расчёта: для 0 секунд — [0, 0], для 5 — [10, 0], для 10 — [20, 0]. Модель намеренно не учитывает дискретные завершения, всплески, ошибки и изменение длительности запросов. Она показывает влияние времени занятости процесса. Чтобы прогнозировать реальный магазин, нужны его собственные измерения.

Как выбрать следующий шаг по наблюдениям

Наблюдение в момент задержки

Следующий шаг

Очередь есть, свободных процессов нет, пул достигает своего предела

Разобрать длительность запросов и причины занятости процессов. Оценку лимита проводить вместе с памятью и базой.

Очередь есть, число процессов ниже верхней границы

Проверить режим пула и появление новых процессов; не считать это доказательством слишком малого лимита.

Очередь пула не видна, ответ всё равно медленный

Проверить выполнение приложения, базу, внешние вызовы и другие участки маршрута.

Высок только старый максимум очереди

Собрать данные текущего эпизода; прошлый пик не объясняет нынешний.

Нулевая очередь в одном снимке не исключает короткий пик между измерениями. И наличие очереди не сообщает, что именно задержало занятые процессы. Полезный результат проверки — временная связь между ожиданием и замедлением, а затем установление причины длительных запросов.

Увеличение числа процессов без расчёта может перенести ограничение на память или базу. Если диагностика действительно указывает на нехватку ресурсов, следующий этап — оценка ресурсов VPS по сценариям нагрузки. Там разобраны условия нагрузочной проверки и критерии масштабирования.

Передайте разработчику время эпизода, маршрут, снимки пула и связанные задержки базы или внешних вызовов. Если сервер и код обслуживают разные команды, заранее определите, кто продолжит диагностику: этот вопрос разобран в статье о границах администрирования и поддержке магазина. Тогда задача заканчивается понятным следующим действием, а не сообщением «CPU свободен».

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.