Нужна помощь в проектировании обработки транскодирования видео с использованием EC2? - PullRequest
1 голос
/ 14 февраля 2011

В настоящее время я транскодирую загруженные пользователем видео на сервер linode и использую s3 для их хранения, но, будучи оптимистом, я хочу перенести транскодирование в Amazon EC2, чтобы при необходимости увеличить его, а также получить опыт от используй это. Это мой рабочий процесс:

  1. Загрузка видео напрямую в s3, минуя стек nginx / Rails
  2. Создание записи в сервисе простой очереди Amazon с URL-адресом видео
  3. Посмотрите, запущены ли какие-либо экземпляры EC2, если не запустить один с простым скриптом ruby ​​в качестве скрипта запуска (я считаю, что Amazon разрешает скрипты запуска размером менее 6 КБ)
  4. Сценарий Ruby подключается к простой очереди и запускает команду ffmpeg для перекодирования видео
  5. Скрипт определяет наличие дополнительных очередей и запускает их
  6. Завершает работу экземпляра, когда очередей больше нет (может заставить его работать полный час, поскольку Amazon взимает плату за полный час для любой части часа, в течение которого работает экземпляр EC)

Очевидно, что вышеупомянутое является основным и не использует EC2 в полном объеме. Я думал об использовании потоков для подключения к очереди и запуска новых заданий на том же экземпляре EC2 или создания дополнительных экземпляров EC2, где сценарий запуска будет запускать сценарий ruby. В первом случае нам нужно ограничить количество заданий в одном и том же EC2 в зависимости от использования процессора.

Последнее кажется пустой тратой, но, учитывая, что транскодирование видео интенсивно использует процессор, возможно, два ffmpegs одновременно неосуществимы. Я также думал об автоматическом масштабировании Amazon для создания новых экземпляров, но использование Ruby кажется мне проще и проще.

  1. Мой вопрос: каков наилучший способ сделать это эффективно?
  2. Запуск двух ffmpegs считается плохой практикой? (Предположим, что размер видео будет в среднем около 200 МБ.)
  3. Оптимально ли использование потоков Ruby, учитывая их плохое имя?
  4. Стоит ли смотреть в EventMachine вместо потоков?

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

На основании этой статьи http://stream0.org/2009/10/h264-video-encoding-on-amazons.htmlhttp://stream0.org/2009/10/h264-video-encoding-on-amazons.html Высокопроизводительный, очень большой экземпляр представляется наилучшим вариантом. Конечно, я планирую провести собственное тестирование, но я хотел бы получить экспертное заключение, прежде чем погрузиться. Спасибо!

Это оказалось эссе, извините за длину.

1 Ответ

2 голосов
/ 15 февраля 2011

Сегодня я провел несколько тестов на своем локальном компьютере, чтобы проверить загрузку процессора с несколькими процессами ffmpeg.Я нашел следующую команду в Интернете, и пока она работает прилично, она кодирует в flv, уменьшает размеры файлов без заметной разницы в качестве.Я почти ничего не знаю о ffmpeg, так что, возможно, команда - полная хрень (пожалуйста, дайте мне знать, если это так).Одна проблема в том, что он не поддерживает потоки в ffmpeg, но я думаю, что это может быть кодеком.

ffmpeg -i explanation-ace-2-3.mp4 -ab 96k -ar 22050 -qscale 6 output3.flv

Я использовал top -b -d 0.5 с интервалом в полсекунды для измерения загрузки процессора и сделал grep Cpu для получения соответствующей информации.Файлы имели размер около 150 МБ и были закодированы той же командой ffmpeg.Я позволил процессу немного запуститься перед запуском нового, и вот мои результаты:

1 FFMPEG | **0.84mbs/sec**
- 306.31 secs - 5:06 

Cpu(s): 23.6%us,  2.9%sy, 73.6%id  
Cpu(s): 23.7%us,  2.4%sy, 73.9%id  
Cpu(s): 23.6%us,  1.9%sy, 74.5%id  

2 FFMPEG | 1.6 mbs/sec
- 319.25 secs - 5:18
- 319.04 secs - 5:18

Cpu(s): 45.9%us,  4.4%sy, 49.8%id  
Cpu(s): 45.0%us,  5.7%sy, 49.3%id  
Cpu(s): 42.9%us,  8.3%sy, 48.8%id  

3 FFMPEGs | **2.23 mbs/sec**
- 344.72 secs - 5:44
- 342.12 secs - 5:42
- 340.39 secs - 5:40

Cpu(s): 68.8%us,  7.3%sy, 23.9%id  
Cpu(s): 70.9%us,  6.9%sy, 22.2%id  
Cpu(s): 66.0%us,  9.9%sy, 24.1%id  

4 FFMPEGs | **2.69 mbs/sec**
- 379.36 secs - 6.32
- 379.70 secs - 6.33
- 380.89 secs - 6.35
- 378.14 secs - 6.30

Cpu(s): 88.2%us, 11.8%sy,  0.0%id  
Cpu(s): 87.7%us, 12.3%sy,  0.0%id  
Cpu(s): 89.7%us, 10.3%sy,  0.0%id

5 FFMPEGs | **2.61 mbs/sec**
- 459.79 secs - 7.66
- 469.03 secs - 7.82
- 448.15 secs - 7.47
- 458.62 secs - 7.64
- 489.47 secs - 8.16

Cpu(s): 93.1%us,  6.4%sy,  0.0%id
Cpu(s): 88.7%us, 11.3%sy,  0.0%id
Cpu(s): 92.2%us,  7.8%sy,  0.0%id

Основываясь на данных, конвертирование видео по одному является грубым при использовании ресурсов, также процессы ffmpeg довольно стабильныМинус пара шипов.4 экземпляра ffmpeg, по крайней мере для моей машины, кажутся наиболее эффективными.

Кажется, у меня возникают проблемы при запуске двух процессов ffmpeg параллельно, используя Thread или fork, используя системную команду.1014 * У кого-нибудь есть мысли по этому поводу?Особенно, как запустить два процесса ffmpeg, используя скрипт Ruby?

...