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()
,