php-fpm зависимость от php-cli процессов

V
На сайте с 05.11.2025
Offline
1
222

Есть проблема.
Имеется nginx + php-fpm и постоянно запущенные скрипты через крон php-cli для тяжелых задач.
Суть в том что если я на постоянной основе запускаю более 2-х скриптов в консоли (через крон),
то nginx + php-fpm перестает отвечать, уходит в ожидание, и как только потушишь процессы в консоли (SigKill), все снова работает и отвечает.
скрипты в консоли стоят в режиме ожидания задач, т.е.
while(true) {
    // some code
    sleep(1);
}

Среда выполнения:
Alt Linux p10
php 7.4.33
Postgres 15
Nginx
Laravel


Если есть идеи куда смотреть / копать буду признателен.

IM
На сайте с 01.08.2025
Offline
10
#1
viktorsvg :

Есть проблема.
Имеется nginx + php-fpm и постоянно запущенные скрипты через крон php-cli для тяжелых задач.
Суть в том что если я на постоянной основе запускаю более 2-х скриптов в консоли (через крон),
то nginx + php-fpm перестает отвечать, уходит в ожидание, и как только потушишь процессы в консоли (SigKill), все снова работает и отвечает.
скрипты в консоли стоят в режиме ожидания задач, т.е.
while(true) {
    // some code
    sleep(1);
}

Среда выполнения:
Alt Linux p10
php 7.4.33
Postgres 15
Nginx
Laravel


Если есть идеи куда смотреть / копать буду признателен.


Может, проблема в лимитах одновременных подключений или памяти? Попробуй проверить настройки max_children для php-fpm и лимиты в системе. А еще можно попробовать запускать тяжелые скрипты через очереди вроде Redis или RabbitMQ, чтобы не блокировать фнд.

V
На сайте с 05.11.2025
Offline
1
#2
isy.m #:

Может, проблема в лимитах одновременных подключений или памяти? Попробуй проверить настройки max_children для php-fpm и лимиты в системе. А еще можно попробовать запускать тяжелые скрипты через очереди вроде Redis или RabbitMQ, чтобы не блокировать фнд.

Настройки php-fpm основное:
pm = dynamic
pm.max_children = 64
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
;pm.process_idle_timeout = 10s;
pm.max_requests = 500
По железу, то же вроде все в норме:
8 ядер / 16 потоков
32 Гб озу
------------------------------------
Redis или RabbitMQ не очень подходят, если опираться на готовые решения, а если городить свой велосипед, то лучше без доп. технологий.
Суть в том, что есть задачи в фоне и некоторые задачи еще могут распараллеливаться на потоки в определенные моменты.
то какая задача и на сколько потоков может распараллелиться определяется конфигом.
Ну и еще пока задача выполняется и не завершилась ее может отменить пользователь.
По этому Redis или RabbitMQ пока не рассматриваю.

GL
На сайте с 21.03.2024
Offline
15
#3
1 При запущенных cli просмотри через top htop что по памяти и cpu

2 посмотри не блокируется ли бд 

3 посмотри при запущенных cli скриптах доходит ли запрос до самого php (сделай простой файл который просто отдает строку.

Если не доходит перенастраивай fpm
Если доходит смотри что получает блокировку из cli так что из fpm падает по таймауту.

Совет не делай while(true)
А лучше выполняй по n действий и перезапускай cli скрипт ну или хотябы запускай с параметром сколько ты даёшь ему памяти и сколько он максимум должен работать.

Upd проверь ещё сколько подключений к postgres и нет ли на это лимита 
V
На сайте с 05.11.2025
Offline
1
#4

1. При запущенных cli просмотри через top htop что по памяти и cpu
процессы спят - S , по памяти потребление около 100-200 Мб, по процессору загрузка 0,1-0,4% ядра/потока

2. посмотри не блокируется ли бд 
Нет бд не блокируется, там в настройках выставил 
max_connections = 68, с запасом (это для разработки на моей машине), и если упираешься в лимит подключений у БД - то в логах соответственно есть ошибка

SQLSTATE[08006]

и ли подобное

3. посмотри при запущенных cli скриптах доходит ли запрос до самого php (сделай простой файл который просто отдает строку.
проверил, не доходит, т.е. скрипт index.php  даже не запускается, иначе отписывался бы лог, специально до запуска лары и инициализации соединения с БД строку вставил.

Если не доходит перенастраивай fpm - вот и хочу понять как, и какая связь между fpm и cli.

Совет не делай while(true) - думал по этому поводу, но тут еще время запуска скрипта добавляется.
Да и скрипты нужно на дежурстве держать постоянно.  т.е. проверка идет еже секундно.

V
На сайте с 05.11.2025
Offline
1
#5
По ходу появилась мысль, завтра поверю, сейчас уже поздно.
Проблема в настройке пользователя php-fpm.

Т.к. у меня, на моей машине php-fpm и php-cli работают из под одного пользователя - то fpm  видит запущенные процессы и пытается им скормит строку запроса.
а процессы запущены как cli и это вызывает зависание fpm.

Если сработает отпишусь.
V
На сайте с 05.11.2025
Offline
1
#6
viktorsvg #:
По ходу появилась мысль, завтра поверю, сейчас уже поздно.
Проблема в настройке пользователя php-fpm.

Т.к. у меня, на моей машине php-fpm и php-cli работают из под одного пользователя - то fpm  видит запущенные процессы и пытается им скормит строку запроса.
а процессы запущены как cli и это вызывает зависание fpm.

Если сработает отпишусь.
Предположение не верное.
Перевел nginx и php-fpm на одну группу/пользователя -> _nginx, настроил права и запустил.
Все работает, но проблема сохранилась.
если более 2-х одновременно запущенных процессов cli , то fpm не отвечает
V
На сайте с 05.11.2025
Offline
1
#7
Спасибо всем, кто принял участие и пытался разобраться и помочь.

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий