14

Работаю на сайте метро. Я запускаю видео через ffmpeg на выделенном сервере Linux для конвертации в mp4.

Спецификации сервера:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Проблема во время тестирования заключается в том, что, даже выполняя всего 4-5 раз, сервер загружается в среднем до 36. Это всего лишь один человек. Я представляю, когда он откроется, многие люди будут загружать сразу.

Кажется, ffmpeg пытается использовать все ресурсы, доступные для конвертации.

Я слышал, что есть настройки нитей, которые вы можете изменить, но я не могу их найти. У меня сервер на 8 процессоров. Он используется только для конверсий, поэтому я слышал, что лучшая настройка будет между 2 и 4. Я могу проверить это.

Но как мне изменить этот параметр? Все, что я вижу в Интернете, обсуждает этот параметр, но не шаги по его изменению.

2 ответа2

17

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

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

Однако есть немало тонкостей, которые увеличивают нагрузку на сервер и время операций, таких как изменение масштаба, применение фильтров и конечное качество кадров / частота кадров - не говоря уже о том, что некоторые архитектуры виртуальных машин фактически читают и записывают все дважды (один раз изначально) и сразу виртуально !!!)

Вот несколько советов, чтобы ускорить вашу работу:

  1. использовать очередь, чтобы за один раз транскодировался только один элемент
  2. запрашивать файлы меньшего размера у ваших пользователей
  3. Используйте всю мощность вашей машины:
    • чтение и запись с ramdisk
    • переход на голое железо для задач перекодирования
    • использовать -threads 0

Что бы вы ни делали, держите своих пользователей в курсе процесса транскодирования, потому что это просто занимает время. (IJTT)

[отредактированная команда, чтобы отразить комментарий LordNeckbeard]

3

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

  • Пусть ffmpeg работает с full horsepower (как назвал это Денджелло)
  • но пусть он работает внутри докера

Теперь вы можете ограничить объем ресурсов, которые может потреблять один экземпляр ffmpeg, даже не используя параметры командной строки ffmpeg. И не только процессор, но и память и IO.

Даже больше: возможно, у вас есть разные задачи, которые могут выполняться в фоновом режиме, и вам все равно, сколько времени они занимают, и у вас есть задачи, которые должны выполняться быстро, чтобы вы могли придать вес различным задачам.

См. Https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources.

На github уже есть предустановленное изображение ffmpeg: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

Вероятно, одно преобразование будет выполняться медленнее из-за накладных расходов, но если вы одновременно запускаете несколько экземпляров, это может быть огромным преимуществом. Все это очень хорошо масштабируется, не говоря уже об улучшенной безопасности, потому что каждая задача изолирована от базовой ОС.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .