Рейтинг:1

PHP-FPM + nginx — пул занят и оптимизируется для возможно плохого кода PHP — ошибка 502

флаг br

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

Это началось с того, что конкретный сайт выдал ошибку 502, просматривая журналы PHP-fpm, я получаю следующее:

ПРЕДУПРЕЖДЕНИЕ: [пул www-userA] кажется занятым (вам может потребоваться увеличить pm.start_servers или pm.min/max_spare_servers), порождает 8 дочерних элементов, 39 простаивают и всего 49 дочерних элементов

Затем я проверил ресурсы сервера, top говорит, что их почти 0, а использование ресурсов составляет всего 2-4%. Далее была настройка пула PHP-FPM:

вечера = динамический
pm.max_children = 800
pm.process_idle_timeout = 5 с
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 80
pm.max_requests = 500
php_admin_value[max_execution_time] = 60

;Добавлено позже для дальнейшего устранения неполадок
request_slowlog_timeout = 5 с
slowlog = /var/log/pool_userA_fpm_slow_log

;Добавлено позже, чтобы компенсировать проблемы с очередью для устранения неполадок.
listen.backlog = 24000

Я был почти во всех сообщениях PHP-FPM, связанных с этой темой, включая: https://stackoverflow.com/questions/25097179/warning-pool-www-seems-busy-you-may-need-to-increase-pm-start-servers-or-pm

Этот сервер имеет около 12 ГБ ОЗУ и 8-ядерный процессор только для nginx + php-fpm. Каждый мой процесс PHP занимает около 15-20 МБ каждый.

Пробовал увеличить pm.max_children = 1500 но через некоторое время снова увидел ту же ошибку «Бассейн занят».

Затем я включил медленный журнал в php-fpm, а также включил медленный журнал для mysql.

  • В медленном журнале php-fpm я обнаружил несколько php-страниц, выполнение которых занимает около 5 секунд,
  • В медленном журнале mysql были обнаружены некоторые запросы, проверяющие 2-5 миллионов строк (выполнение которых занимает около 5 секунд).

Предполагая, что PHP-скрипт может вызывать очередь или отставание, поэтому я добавил listen.backlog = 24000 а также в /etc/security/limits.conf добавлено мягкое и жесткое ограничение для данного конкретного пользователя, чтобы оставалось место для медленных скриптов,

userA soft nofile 4096
userA жесткий nofile 65536

Далее в sysctl т.е.

эхо "net.core.somaxconn=65536" >> /etc/sysctl.conf

Далее в php-fpm master добавлен php-fpm.conf, т.е. конф вне бассейна:

rlimit_files = 65536
rlimit_core = 0

Мой ulimit -Hn говорит:

524288

Кроме того, поскольку php-fpm был занят, я обнаружил, что могу добавить следующие директивы в php-fpm для перезапуска в случае занятости, но этого не происходит, мне нужно вручную перезапустить php-fpm, чтобы сайт снова заработал :

[Глобальный]
Emergency_restart_threshold 10
Emergency_restart_interval 1 м
process_control_timeout 10 с

Как сказано выше, директива не выполняет перезапуск в случае ошибки занятости пула в php-fpm.log.

Пока я предполагаю, что из-за медленного PHP-скрипта мои дети php-fpm истощаются и вызывают ошибку 502. У меня нет контроля над PHP, и мне нужно представить решение, настроив для него конфигурацию сервера.

я пытался увеличить pm.max_children = 2000 но все та же проблема. Иногда получаю Ошибка 504 Время ответа сервера истекло ошибки.

С другой стороны, если я изменено pm = ondemand

Сначала я получаю следующее уведомление:

 listen.backlog(25000) слишком мал для менеджера процессов по требованию. Я обновил его для вас до 65535

Позже получил эту ошибку и снова на этот раз ошибка 504:

[11-Nov-2021 06:56:45] ВНИМАНИЕ: сервер [pool userA] достиг настройки max_children (800), рассмотрите возможность ее повышения.

В целом стоит отметить, что нагрузка на сервер практически отсутствует во всех случаях, 2-4% использования ресурсов. Поэтому я предполагаю, что это больше проблема конфигурации, чем использование ресурсов.

Я побывал здесь почти во всех темах, связанных с PHP-FPM, о сбое сервера и множестве документов, но до сих пор не получил никакого результата. Здесь надеюсь, что кто-то может указать мне в правильном направлении.

Спасибо

Wilson Hauck avatar
флаг jp
Запрос дополнительной информации, пожалуйста. Любые устройства SSD или NVME на хост-сервере MySQL? Опубликуйте на pastebin.com и поделитесь ссылками. Из вашего корня входа SSH, текстовые результаты: A) ВЫБРАТЬ COUNT(*) FROM information_schema.tables; B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС; минимум через 24 часа UPTIME C) ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ; D) ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ; И очень полезная информация, включая - htop ИЛИ top для наиболее активных приложений, ulimit -a для списка ограничений Linux/Unix, iostat -xm 5 3 для IOPS по устройствам и количеству ядер/процессоров, для анализа настройки рабочей нагрузки сервера, чтобы предоставить предложения.

Ответить или комментировать

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