Я был в ситуации, когда я не мог заставить 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, о сбое сервера и множестве документов, но до сих пор не получил никакого результата. Здесь надеюсь, что кто-то может указать мне в правильном направлении.
Спасибо