LINUX.ORG.RU

FFMPEG блокирует работу сайта

 , , ,


1

1

Всем добра!

У нас нас сайте фотостока работает готовый скрипт (на php). Сам сайт работает на apache+ngnix, панель управления fastpanel, Сервер сайта - виртуальная машина Proxmox, 8 ядер, 6ГБ ОЗУ.

При загрузке новых видеоматериалов на сайт скрипт генерирует превью этих материалов, используя вызов ffmpeg (через exec()).

При этом, пока ffmpeg работает - сайт висит наглухо. Утилизация процессора ВМ доходит в этот момент до 100%. Это очень неприятно, особенно когда выполняется пакетная обработка входящих материалов.

У ffmpeg есть опция -threads, в которой вроде можно указать кол-во ядер, которое он будет использовать.

Пробовал -threads 6, -threads 4 Да, утилизация CPU снижается (до 50-80%), но сайт всё равно висит, пока вся пакетная обработка видеоматериалов не закончится.

Что ещё можно сделать, чтобы сайт не вис?

Делать асинхронную обработку превьюшек.

AnDoR ★★★★★
()

Скрипт у вас весь видео файл нарезает на фреймы? Иначе не могу понять откуда такая нагрузка.

ritsufag ★★★★★
()
Ответ на: комментарий от ritsufag

Скрипт у вас весь видео файл нарезает на фреймы?

Добавляет водяной знак и уменьшает длительность до 10с

Иначе не могу понять откуда такая нагрузка.

Может потому, что файлы достаточно большие - 200-700 Мб каждый?

Garik368
() автор топика

Заведи таблицу video_queue и добавляй туда имена загруженных файлов, заведи скрипт на php который будет работать отдельно от сервера, и который будет проходить по video_queue, обрабатывать файлы и удалять то что он уже обработал.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от anonymous

Может из-за IO висит? Какой планировщик?

Скрипт запускает в php такую команду

exec ($com);

где

$com = /usr/bin/ffmpeg -i "/var/www/data/content2/260/ANMLD10UP_0274.mov" -vcodec libx264 -strict -2 -threads 4 -t 10  -vf 'movie=/var/www/data/content/watermark.png [wm];[in][wm] overlay=(main_w-overlay_w-10)/2:(main_h-overlay_h-10)/2 [out]' /var/www/data/www/content2/260/thumb.mp4

всё это происходит на SSD диске

Garik368
() автор топика

«Сайт висит» это диагностика домохозяйки. Посмотри на чём именно он задерживается. Если не знаешь как - тебе сюда www.linux.org.ru/forum/job/

firkax ★★★★★
()
Ответ на: комментарий от Garik368

Да даже при 100% загрузке не должно ничего висеть. У сервера приоритет и найс обычные?

А может быть не висит, а падает, так как заканчивается память? В логах что-то есть?

anonymous
()
Ответ на: комментарий от anonymous

У сервера приоритет и найс обычные?

Я поставил fastpanel (а она в процессе своей установки сама ставит apache, ngnix, mysql и др.) со всеми параметрами по умолчанию. Тайм-ауты только увеличил и максимальный размер передаваемого файла.

Приоритет я не трогал и не знаю, где он настраивается)

А может быть не висит, а падает, так как заканчивается память?

Память используется не больше, чем на 90%. Свап файл вообще практически не используется.

Вот в состоянии, когда ffmpeg не работает:

:~$ top
top - 22:27:14 up 1 day, 23:02,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 221 total,   1 running, 220 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   5940.2 total,    322.0 free,    585.3 used,   5032.9 buff/cache
MiB Swap:   1981.0 total,   1976.0 free,      5.0 used.   5041.9 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     20 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-kblockd
     21 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/2
     22 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/2
     23 root      rt   0       0      0      0 S   0.0   0.0   0:01.00 migration/2
     24 root      20   0       0      0      0 S   0.0   0.0   0:00.04 ksoftirqd/2
     26 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/2:0H-kblockd
     27 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/3
....

Непонятно только, почему большая часть памяти под кэш используется

После того, как ffmpeg закончит свою работу, сайт работает быстро.

В логах что-то есть?

В логах веб-сервера ничего такого нет. В каких логах ещё посмотреть?

Garik368
() автор топика
Ответ на: комментарий от MOPKOBKA

Заведи таблицу video_queue и добавляй туда имена загруженных файлов, заведи скрипт на php который будет работать отдельно от сервера, и который будет проходить по video_queue, обрабатывать файлы и удалять то что он уже обработал.

Это нужно весть этот модуль переписать. Как я написал, скрипт этот готовый, и достаточно сложный. Не хотелось бы в чужой код сильно лезть…

Garik368
() автор топика
Ответ на: комментарий от Garik368

Зачем? Просто в этом модуле замени $_FILES[] на $argv[] и запускай его через интерпретатор, инклуды пусть остаются и прочее.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

заведи скрипт на php который будет работать отдельно от сервера

Что имеется ввиду? Отдельно от какого сервера?

Отдельно от веб-сервера?

Но на том же самом физическом сервере (виртуальной машине)?

Garik368
() автор топика
Ответ на: комментарий от Garik368

Скрипт запускает в php такую команду

exec ($com);

А после exec этот скрипт что-то делает? Если там есть какой-то код, то естественно он будет выполняться после завершения exec

Утилизация процессора

происходит на свалке, учите русский

annulen ★★★★★
()
Ответ на: комментарий от annulen

утилизировать - употребить (-реблять) с пользой (перерабатывая, используя каким-нибудь образом)

Толковый словарь Ожегова.

anonymous
()
Ответ на: комментарий от annulen

А после exec этот скрипт что-то делает? Если там есть какой-то код, то естественно он будет выполняться после завершения exeс

Т.е. получается, что я неправильно тестирую?

Я в одном окне браузера запустил процесс генерации превью, где используется ffmpeg, и параллельно в другом окне браузера пытаюсь обновить другую страницу этого же сайта. Т.к. веб-сервер «понимает», что это один и тот же пользователь, то он на него выделяет один процесс, который продолжится только после того, как завершится выполнение exec()?

А если в это же время другой пользователь зайдёт на сайт - у него сайт будет прекрасно работать?

Garik368
() автор топика
Ответ на: комментарий от Garik368

Т.к. веб-сервер «понимает», что это один и тот же пользователь, то он на него выделяет один процесс, который продолжится только после того, как завершится выполнение exec()?

Ну это странно. Попробуй закрывать соединение в своём скрипте. Не знаю как там из похапе это правильно сделать, но ты можешь попытаться послать заголовок Connection: close.

anonymous
()
Ответ на: комментарий от anonymous

Content-Length возможно ещё дополнительно надо послать.

anonymous
()

Чтобы FFMPEG не захватывал полностью процессор, выполняйте его с пониженным приоритетом - через команду nice.

vinvlad ★★
()

… Ну и еще FFMPEG память жрет неслабо. Гигабайт и больше отожрать - это ему запросто. Увеличение числа тредов увеличивает расход памяти. Так что, у вас при работе FFMPEG может иметь место свопинг. Гляньте вывод команды «free» в процессе работы FFMPEG.

vinvlad ★★
()
Ответ на: комментарий от vinvlad

по использованию памяти такая вот картина:

:~$ free
              total        used        free      shared  buff/cache   available
Mem:        6082792     2756712      142872       12160     3183208     3012000
Swap:       2028540       28428     2000112
Garik368
() автор топика

Надо разобраться, почему сайт висит. Загрузка процессора на 100% это не причина.

goingUp ★★★★★
()
Ответ на: комментарий от Garik368

Если это листинг free в момент выполнения скрипта, то с памятью проблем нет.
Вопросы:

  1. Из стартового топика не совсем понятно, как запускается скрипт - из Apache или просто отдельно?
  2. Отдается ли при работе скрипта статика или Nginx тоже висит? (попробуйте просто запросить статичный файл в этот момент)
  3. Надо глянуть приоритеты выполняемых процессов. Выполните в момент работы скрипта командушку:
    ps -eo uid,pid,ppid,c,ni,stime,cmd
    Колонка NI - nice-значение процесса.
  4. Ну и не дожидаясь всяких советов попробуйте просто запускать ffmpeg с пониженным приоритетом. Можно чуть приподнять приоритет Nginx.

Полезные ссылочки:
https://www.tecmint.com/set-linux-process-priority-using-nice-and-renice-commands/
https://www.freedesktop.org/software/systemd/man/systemd.exec.html (nice-параметр)

vinvlad ★★
()
Ответ на: комментарий от goingUp

Действительно, я был не совсем прав - сайт во время работы ffmpeg висит, если ты пытаешься его открывать в этом же броузере, но в другом окне.

Если же открыть новый экземпляр броузера (я открываю его в режиме «инкогнито») - сайт работает

Garik368
() автор топика
Ответ на: комментарий от goingUp

Плюсую. Первым делом убить сессию при старте скрипта.

Jaberwock ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.