Как настроить Apache и php для запуска скриптов без взаимной блокировки?

Главные вкладки

Аватар пользователя winny63 winny63 23 августа 2018 в 20:50

Подскажите, где можно почитать про настройку конфигурации сервера Apache на Linux, на котором запуск от имени админа (кроном или вручную) высоконагруженного скрипта php (например, содержащего вызов программы ffmpeg для перекодировки видеофайла, или индексацию поиска, или операции перевода контента на другой язык с использованием внешних сервисов и т.п.) не приводило бы к блокировке запуска других скриптов?

Комментарии

Аватар пользователя winny63 winny63 25 августа 2018 в 22:48

вот, это уже ближе к теме, спасибо!
а не подскажите, как надо запускать "командные строки" в цикле, чтобы следующий запуск начался только после отработки предыдущего? а то создается впечатление, что, например, при обработке группы видеофайлов перекодировщики ffmpeg запускаются "сразу" до "тупого" переполнения памяти или истощения какого-либо важного для php или ОС ресурса и система еле дышит, пока всех их закончит...
а как быть, если есть скрипт, выполняющий в цикле много последовательных запросов к БД, обработку данных, апгрейд БД, и если его запускать из браузера, то все висит (браузер, по крайней мере), а хотелось бы чтобы он выполнялся в фоне с небольшим приоритетом, не мешая остальным. Запустить его в кроне? Есть ли какая-нибудь особенность этого запуска или можно просто в расписании прописать этот скрипт и дальше все пойдет само? А какой у этой задачи будет приоритет? Или для php такой термин не применим?

Аватар пользователя gun_dose gun_dose 28 августа 2018 в 7:05

Пхп по умолчанию синхронный и однопоточный, поэтому цикл всегда проходит последовательно. Если у вас при этом другие задачи тормозят на сервере, то у вас скорее всего слабый сервер. В первую очередь нужно обратить на количество ядер и их тактовую частоту.

Аватар пользователя bsyomov bsyomov 28 августа 2018 в 11:47

PHP может выполнять скрипты из командной строки, скрипты, при этом, они должны быть на это рассчитаны - там другое несколько окружение. Можно использовать nice/ionice для управления приоритетами выполнения. Конечно, это должен быть процесс выполняющийся в php-cli, а не страничка дёрнутая через какой-нить wget, т.к. приоритет будет задан для wget, а не для генерации этой странички. В частности, можно запускать такие скрипты и через крон.

Есть масса методов, обеспечивающих последовательное выполнение задач. В простейшем случае, можно написать свой скрипт, который проверяет, что он запущен только в одном экземпляре(блокировка через базу, блокировка через flock и.т.п.), и запускает необходимые задачи(их очередь можно строить в базе, например), и выполнять его по крону.

Ffmpeg имеет опцию, позволяющую выделять ему определённое количество ядер(по умолчанию используются все), этим можно пользоваться, чтобы ограничить нагрузку. Вообще, конвертация видео, процесс очень ресурсоёмкий. Если у вас какая-то виртуалка с одним/двумя ядрами, конечно всё будет тормозить.

Аватар пользователя sas@drupal.org sas@drupal.org 27 августа 2018 в 8:36

Про балансировку параллельных задач не подскажу не сталкивался, все что касается оптимизации загрузки системы imho хорошо делать на уровне системного ПО, а значит нужен толковый сисадмин. Всё таки многие вопросы с системным ПО требует глубоких знаний и практических умений в области системного (сервер) а не прикладного (php) ПО.

Аватар пользователя Phantom63rus Phantom63rus 28 августа 2018 в 1:00

Что касается высоконагруженных серверов - это вы действительно форумом ошиблись.

Для начала нужно определиться с задачами. Обработка видео? Ок, при значимых объёмах это делается отдельно от веб-сервера. Перелопатить БД? Пардон, но тут что-то не то с архитектурой, такие задачи возникают в случае перетряхивания инфраструктуры, а не ежедневно. Высоконагруженные БД? Опять же - это вынос на отдельный сервер, там свои сорта оптимизаций.

Всё это не решается в рамках бла-бла трёпа на форуме, нужна как минимум чёткая постановка задачи, но скорее найм профильных спецов за хорошие деньги (highload штука недешёвая).

Аватар пользователя bsyomov bsyomov 29 августа 2018 в 19:36

А как это относится к вопросу? Думаете у автора prefork, и максимум в пару обработчиков установлен? Smile Вряд-ли. А иначе, ничего похожего на блокировку тут не получить. И никакой mpm апача не поможет, если просто не хватает вычислительных ресурсов, которые скушал ffmpeg по соседству запущенный...

Кстати, самый продвинутый это mpm_event, но и с ним, и с mpm_worker, php будет работать только в режиме fastcgi (php-fpm, или через mod_fcgid). А практически в любом случае работы c php, через fastcgi, будет разумнее использовать любой другой, более лёгкий веб сервер, а не apache.