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

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

Позвольте мне объяснить: мой сайт запускает конвертер аудио (ffmpeg), используя inotify + скрипт bash. Конвертер работает, используя "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 Ответ

0 голосов
/ 07 февраля 2019

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

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

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

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

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

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

...