PHP-FPM не отвечает, когда загрузка процессора составляет 100% в процессах с низким приоритетом

У меня проблема, когда процессор загружен на 100%: PHP-FPM не отвечает, даже процессы, использующие 100% процессоров, работают с самым низким приоритетом (+19).

Позвольте мне объяснить: мой сайт запускает аудио конвертер (ffmpeg), используя inotify + bash script. Конвертер работает, используя "nice -n 19". Таким образом, загрузка процессора составляет 100%, но теоретически PHP-FPM имеет приоритет (приоритет по умолчанию 0).

Что происходит: только PHP зависает. Apache может отвечать на файлы, такие как JPG/CSS/JS. Linux стабильный, другие ПО тоже. Все.php возвращает "504 Gateway Timeout" (браузер, ответ Apache). Apache открывает множество экземпляров php-fpm и держит их открытыми.

30585 fedora    19   0.0   0.3   0:00.00 snippeter
30586 fedora    19  25.0   2.8   0:00.10 ffmpeg

15640 fedora     0   0.0   1.0   0:00.12 php-fpm
17174 fedora     0   0.0   1.0   0:00.10 php-fpm
20583 fedora     0   0.0   0.9   0:00.00 php-fpm
21072 fedora     0   0.0   0.9   0:00.00 php-fpm
21309 fedora     0   0.0   0.9   0:00.00 php-fpm
22601 fedora     0   0.0   0.9   0:00.00 php-fpm
23172 fedora     0   0.0   0.9   0:00.00 php-fpm
23277 fedora     0   0.0   0.9   0:00.00 php-fpm
24170 fedora     0   0.0   0.9   0:00.00 php-fpm
24823 fedora     0   0.0   0.9   0:00.00 php-fpm
24916 fedora     0   0.0   0.9   0:00.00 php-fpm
26589 fedora     0   0.0   0.9   0:00.00 php-fpm

%Cpu(s):  8.5 us,  4.5 sy, 85.6 ni,  0.0 id,  0.5 wa,  1.0 hi,  0.0 si,  0.0 st

Изменение приоритета php-fpm (renice), без разницы.

Я не знаю, что делать... Я хочу запускать процессы в фоновом режиме, даже используя 100% процессорного времени, но PHP+Apache работает нормально.

Сервер: Fedora 29, PHP 7.2.

1 ответ

Решение

Нашел решение!

Проблема не связана со 100% загрузкой процессора или только с одним процессором. Так как у меня есть цикл, чтобы открыть каждый аудио конвертер (bash-файл) и дождаться его завершения для запуска следующего, сессия PHP заблокирована! Таким образом, когда другой сценарий PHP в том же сеансе пытается выполнить, он не может прочитать файл сеанса, поэтому PHP зависает (в ожидании доступа к файлу сеанса до появления ошибки "Время ожидания шлюза"). Вот почему только PHP зависает, а не другие программы.

Чтобы исправить, я должен был запустить это до основного цикла:

session_write_close();
session_start(['read_and_close'=>true]);

Таким образом, он записывает и закрывает файл сеанса и снова читает его, не блокируя его.

Это работает только в PHP 7+, и, очевидно, вы не можете записывать данные сеанса. Или, после цикла, просто снова откройте сеанс с помощью session_start(),

Другие вопросы по тегам