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

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

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

Что происходит: зависает только PHP. Apache может реагировать на такие файлы, как JPG/CSS/JS. Линукс стабильный, другие ПО тоже. Все .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.

сколько процессоров в сервере?

user10051234 17.01.2019 23:59

1 процессор, это VPS.

Arvy 18.01.2019 00:02

Почему это на 100%?

Ibu 18.01.2019 00:02

Запуск фоновых процессов, но все с приоритетом +19 (приятно).

Arvy 18.01.2019 00:03

Какой VPS? Тот, который выделяет вам фактическое физическое ядро, тот, который выделяет вам часть ядра, или «разрывное» ядро, которое, вероятно, вызовет именно эту проблему? Вам также необходимо реализовать актуальный мониторинг ресурсов постоянный, чтобы проиллюстрировать проблему, подобную этой, поскольку случайные измерения на определенный момент времени точно не рисуют большую часть картины.

Sammitch 18.01.2019 00:03

учитывая цену хостинга, я бы просто поставил на него еще один процессор, хотя бы для проверки

user10051234 18.01.2019 00:04

Это VPS на Vultr, KVM, так что дробь.

Arvy 18.01.2019 00:04

Но приоритет +19 для процессов с высокой загрузкой ЦП заморозит php-fpm? Я не понимаю, почему затронут только PHP. Все остальные программы работают нормально, получая больше циклов ЦП по запросу...

Arvy 18.01.2019 00:06

* Примечание: во время преобразования у меня есть один PHP-скрипт, работающий без ограничения по времени, только отслеживание и ожидание завершения процесса ffmpeg, но это почти 0% ЦП ... может ли PHP-скрипт, работающий в цикле, заморозить другие запросы?

Arvy 18.01.2019 00:09

Я знаю, что это не ответит на вопрос, но в целом я бы посоветовал вам перенести обработку ffmpeg на второй VPS, который обрабатывает только это, чтобы вы не мешали другому (казалось бы, более актуальному/критическому процессу, такому как как php-fpm)

Javier Larroulet 18.01.2019 00:27

Сказав это, ваша проблема мая связана не с процессором, а с памятью. Ffmpeg использует тонну оперативной памяти (вероятно, все, что доступно), поэтому, даже если у вас больше приоритет ЦП для php-fpm, может случиться так, что у него недостаточно памяти даже для запуска.

Javier Larroulet 18.01.2019 00:29

Да, я думал об этом, использовать другой VPS для конвертации файлов. Но проблема не связана с памятью. Конвертирую несколько файлов пакетно, аудиофайлы, но все маленькие MP3, 2-4 минуты, а на сервере при конвертации около 60% свободной оперативной памяти. Я просто не понимаю, почему зависает только PHP. Возможно, какая-то проблема со связью с Apache, даже Apache нормально отвечает на файлы, отличные от php.

Arvy 18.01.2019 00:38

вы можете использовать специальный сервис, такой как Amazon Elastic Transcoder,

user10051234 18.01.2019 00:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
13
961
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение найдено!

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

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

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

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

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

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