06.02.2022

Тестируем многопоточную раздачу видео на игровых GPU

server one
HOSTKEY



При работе с потоковым видео качество и скорость воспроизведения играют ключевую роль. Можно ли настроить многопоточную трансляцию без покупки дорогостоящего «железа»? Попробуем разобраться.

Проблема.

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

Какова альтернатива?

Существенно снизить капитальные затраты и перевести их в операционные можно за счет аренды облачных серверов с GPU, причем стоит сделать ставку на аппаратное транскодирование на Nvidia NVENC Nvidia NVENC. Кроме сокращения расходов, вы упростите организацию трансляции живых потоков.

А вот для организации вещания стоит попробовать FFmpeg.

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

Схема процесса транскодинга с применением FFmpeg:

scheme-1
Арендуйте готовые GPU сервер с моментальным деплоем или сервер индивидуальной конфигурации с профессиональными картами NVIDIA RTX 4000 / 5000 / A6000. Эти решения идеальны для удаленного доступа к высоконагруженным приложениям из любой точки мира.

Патч для драйвера и сборка FFmpeg

Проводить тестирование мы будем в Ubuntu Linux, причем начнем с игровых графических ускорителей: GeForce GTX 1080 Ti и GeForce RTX 3090. В реальных проектах они не используются, но продемонстрировать разницу между транскодированием на CPU и GPU вполне способны. Производитель не считает эти адаптеры «квалифицированными» и ограничивает максимальное количество одновременных сеансов транскодирования видео NVENC. Чтобы решить эту проблему, придется применить хитрость и отключить проверку с помощью выложенного энтузиастами на GitHub патча для видеодрайвера.

Патч не потребуется для профессиональных видеокарт, например, таких как RTX A4000 или A5000, поскольку для них в драйвере нет жесткого ограничения количества потоков. Список видеокарт Nvidia с поддержкой NVENC доступен на сайте производителя. Технологию можно использовать в виде набора разработчика NVENC SDK.

Также необходимо собрать FFmpeg с поддержкой GPU Nvidia. Пока мы не выложили его в репозиторий, поэтому приведем подробную инструкцию для Ubuntu (в других дистрибутивах Linux порядок действий сходный):

# Compiling for Linux
# FFmpeg with NVIDIA GPU acceleration is supported on all Linux platforms.
# To compile FFmpeg on Linux, do the following:
# Clone ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
# Install ffnvcodec
cd nv-codec-headers && sudo make install && cd –
# Clone FFmpeg's public GIT repository.
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
# Install necessary packages.
sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
# Configure
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared
# Compile
make -j 8
# Install the libraries.
sudo make install

Настройка трансляции

Для трансляции потокового видео c использованием FFmpeg нам понадобится ffserver. Отредактируем файл ffserver.conf (стандартный путь к нему — /etc/ffserver.conf).

Пример конфигурации ffserver для потокового вещания:

# Указываем порт, на котором будет работать сервер.
HTTPPort 8090
# Адрес, на котором будет работать сервер (0.0.0.0 — все доступные адреса).
HTTPBindAddress 0.0.0.0
# Максимальная пропускная способность на одного клиента в кб/с (до 100000).
MaxClients 1000
RTSPPort 5454
RTSPBindAddress 0.0.0.0
<Stream name>
Format rtp
File /root/file.name.mp4
ACL allow 0.0.0.0
#VideoCodec libx264
#VideoSize 1920X1080
</Stream>

Пример команды для запуска потокового вещания

ffserver ffmpeg bbb_sunflower_1080p_30fps_normal.mp4 http://ip/feed.ffm

Пример декодирования потокового видео с использованием GPU и декодера NVENC (подключение к трансляции потокового видео и сохранение его на устройство):


ffmpeg -i rtsp://ip:5454/nier -c:v h264_nvenc Output-File.mp4

Пример вывода nvidia-smi подтверждает, что FFmpeg использует GPU: 0 N/A N/A 27564 C ffmpeg 152MiB.

Тестирование

Сравнительное тестирование транскодинга живых потоков FullHD 1080p в high profile H.264 мы провели на потребительских видеокартах, не проходивших специальной подготовки. Работа GeForce RTX 3090 была проверена без снятия ограничений на количество потоков, а также с пропатченным драйвером (для GTX 1080 Ti тест без патча показался нам избыточным). В качестве исходного видео выбрали один из демофайлов Blender — bbb_sunflower_1080p_30fps_normal.mp4

Для тестирования сигнала использовался входной поток со следующими параметрами:

Компрессия видео ОH.264
Размер кадра 1920 x 1080 пикселей
Частота кадров 30 кадров/сек
Битрейт видео 2,996 Мбит/сек
Компрессия аудио AAC
Частота аудиосигнала 48 кГц
Количество аудиоканалов Стерео
Битрейт аудио 479 кбит/сек
Компрессия видео H.264
Размер кадра 1920 x 1080 пикселей
Частота кадров 30 кадров/сек
Битрейт видео 2,996 Мбит/сек
Компрессия аудио AAC
Частота аудиосигнала 48 кГц
Количество аудиоканалов Стерео
Битрейт аудио 479 кбит/сек



Разрешение FullHD 1080p считается одним из самых распространенных для потокового вещания видео в режиме реального времени и позволяет обеспечить интенсивную вычислительную нагрузку при тестировании.

Описание тестовой среды:

Тест на CPU GeForce GTX 1080 Ti GeForce RTX 3090
CPU 4 x VPS Core 4 x VPS Core 1 x Xeon E3-1230v6 3.5GHz (4 cores)
RAM 1 x VPS RAM 16Gb 1 x VPS RAM 16Gb 2 x 16 Gb DDR4
HDD 1 x VPS HDD 240 Gb 1 x VPS HDD 240 Gb 1 x 512Gb SSD
1 x 120Gb SSD
Other hardware 1 x VGPU 1080Ti 1 x VGPU 1080Ti 1 x RTX 3090
Тест на CPU
CPU 4 x VPS Core
RAM 1 x VPS RAM 16Gb
HDD 1 x VPS HDD 240 Gb
Other hardware 1 x VGPU 1080Ti
GeForce GTX 1080Ti
CPU 4 x VPS Core
RAM 1 x VPS RAM 16Gb
HDD 1 x VPS HDD 240 Gb
Other hardware 1 x VGPU 1080Ti
GeForce RTX 3090
CPU 1 x Xeon E3-1230v6 3.5GHz (4 cores)
RAM 2 x 16 Gb DDR4
HDD 1 x 512Gb SSD
1 x 120Gb SSD
Other hardware 1 x RTX 3090



При тестировании мы получили следующую нагрузку:


Fan Temp Perf Pwr:Usage/Cap Memory-Usage
GeForce GTX 1080 Ti 59% 82C P2 86W / 250W 5493MiB/11178MiB
GeForce RTX 3090 43% 51C P2 149W / 350W 22806MiB /24267MiB
GeForce GTX 1080Ti
Fan 59%
Temp 82C
Perf P2
Pwr:Usage/Cap 86W / 250W
Memory-Usage 5493MiB/11178MiB
GeForce RTX 3090
Fan 43%
Temp 51C
Perf P2
Pwr:Usage/Cap 149W / 350W
Memory-Usage 22806MiB /24267MiB

Тест на CPU без использования GPU прошел успешно, но максимально загрузил сервер: были задействованы все вычислительные ядра и вся доступная память, а на выходе мы получили лишь несколько потоков. Высокая нагрузка на процессор не позволяет эффективно использовать такой способ для организации реальной трансляции из-за риска возникновения критических ошибок и сбоев. CPU не годится для проведения большого количества параллельных операций.

При проведении тестирования GPU на вход декодера подавался один поток, а на выходе транскодированные потоки раздавались через протокол rstp. Отметим, что GeForce RTX 3090 без патча драйвера осилила только три потока. При попытке обработать больше мы получили ошибки:

[h264_nvenc @ 0x55ddbdd3ef80] OpenEncodeSessionEx failed: out of memory (10): (no details)
[h264_nvenc @ 0x55ddbdd3ef80] No capable devices found
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

Количество потоков после применения патча к видеодрайверу и объем используемой памяти представлены на диаграмме:

video card testing

Лимит количества обрабатываемой каждой картой потоков ограничен как объемом памяти GPU, так и оперативной памятью. Модификации GeForce RTX 3090 отличаются по объему видеопамяти, но обрабатывают одинаковое количество потоков, что определяется тестовой сборкой — 32 Гб оперативной памяти. Ниже приведен пример вывода данных об оперативной памяти тестового стенда с видеокартой GeForce RTX 3090 при проведении тестирования:

  Total Used Free Shared Buff Cache available
Mem 31 G 11 G 234 M 1,3 G 19 G 18 G
Swap 4,0 G 1,0 M 4,0 G
Mem
Total 31 G
Used 11 G
Free 234 M
Shared 1,3 G
Buff 5493MiB/11178MiB
Cache available 18 G
Swap
Total 31 G
Used 11 G
Free 234 M
Shared
Buff
Cache available

Заключение

Тестирование на потребительских видеоадаптерах требует грубого вмешательства в системное ПО, но даже оно показывает, что серверы с GPU позволяют организовать транскодирование живых потоков под большими нагрузками.

То есть FFmpeg вполне можно выбрать для качественной трансляции без покупки коммерческого программного обеспечения и дорогостоящих рабочих станций. Например, как бюджетный вариант для задач видеонаблюдения и сохранения потоков с нескольких десятков камер в файлы: здесь можно взять машину с одной GTX 1080 Ti и писать с нее потоки на NAS самостоятельно.

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

Разумеется, вне вашего офиса/площадки или на территории ЦОДа из-за лицензионных правил NVidia использовать игровые карты не получится, да и незачем: для этого есть профессиональные линейки. Об экспериментах с ними расскажем в следующей части статьи.

Арендуйте готовые GPU сервер с моментальным деплоем или сервер индивидуальной конфигурации с профессиональными картами NVIDIA RTX 4000 / 5000 / A6000. Эти решения идеальны для удаленного доступа к высоконагруженным приложениям из любой точки мира.

Дригие статьи

11.05.2022

Интеграция FreeIPA с Active Directory

Рассказываем, как мы интегрировали FreeIPA с Active Directory, чтобы управлять офисными машинами с Windows и оборудованием Cisco Systems.

11.05.2022

Apache Guacamole и взаимодействие с API: реальный кейс использования oVirt

Рассказываем как удаленно управлять оборудованием Dell с помощью встроенной в DRAC консоли VNC.

10.05.2022

Тестируем «космические» технологии: насколько эффективно пассивное охлаждение серверов?

Специалисты HOSTKEY завершили пилотное внедрение альтернативной разработки компании «Теркон» — создателя систем охлаждения для космических аппаратов.

28.04.2022

10 простых шагов: мигрируем с CentOS 8 на RockyLinux или AlmaLinux

Пошаговая инструкция по переходу на RockyLinux или AlmaLinux — популярные бесплатные дистрибутивы, бинарно совместимые с RedHat Enterprise Linux (RHEL).

21.04.2022

Linux LiveCD на базе CentOS и техники его использования в PXE-загрузке через Foreman

Рассказываем, как мы создали собственный LiveCD на основе CentOS.

HOSTKEY Выделенные серверы в Европе, России и США Готовые выделенные серверы и серверы индивидуальных конфигураций на базе процессоров AMD, Intel, карт GPU, Бесплатной защитой от DDoS -атак и безлимитный соединением на скорости 1 Гбит/с 30
4.3 48 48
Upload