Начиная со сборки 5.2.2022, WCS поддерживает аппаратное ускорение при декодировании и кодировании видео с использование NVIDIA GPU.
Настройка
Для работы аппаратного ускорения на сервере должны быть установлены NVIDIA CUDA драйверы по инструкции с официального сайта. При этом CUDA toolkit устанавливать не нужно:
sudo apt-get install -y cuda-drivers
Если драйверы установлены успешно, утилита nvidia-smi
покажет текущее состояние GPU
Поддержка аппаратного ускорения включается настройкой
enable_hardware_acceleration=true
При включенном аппаратном ускорении приоритет будет у CUDA кодировщика/декодировщика, если сценарий использования не попадает под исключения!
Настройка для работы под нагрузкой
Настроек по умолчанию достаточно для небольшого количества сессий транскодинга и тестирования. Однако для эксплуатации в условиях повышенных нагрузок необходимо настроить такие параметры, как максимально допустимое количество кодировщиков на графическое ядро и на сервер в целом. Для этого используется файл настроек /usr/local/FlashphonerWebCallServer/conf/gpu_config.json
[ { "gpuName" : "Tesla P100-PCIE-16GB", "disabled" : false, "config" : { "maxEncodeSessions" : 95, "maxHostEncodeSessions" : 95, "maxDecodeSessions" : 19, "maxEncoderUtilization" : 90, "maxDecoderUtilization" : 90, "minMemoryAvailable" : "4 GB" } } ]
[ { "pciBusId" : "0000:02:00.0", "disabled" : false, "config" : { "maxEncodeSessions" : 95, "maxHostEncodeSessions" : 95, "maxDecodeSessions" : 19, "maxEncoderUtilization" : 90, "maxDecoderUtilization" : 90, "minMemoryAvailable" : "4 GB" } } ]
Здесь:
- gpuName - имя GPU
- pciBusId - идентификатор GPU на PCI шине
- disabled - не использовать GPU
- maxEncodeSessions - максимальное количество кодировщиков на GPU
- maxHostEncodeSessions - максимальное количество кодировщиков на сервере
- maxDecodeSessions - максимальное количество декодеров на GPU
- maxEncoderUtilization - максимальная нагрузка на GPU при кодировании, в процентах
- maxDecoderUtilization - максимальная нагрузка на GPU при декодировании, в процентах
- minMemoryAvailable - минимальное количество свободной памяти
Если в сервер установлены несколько GPU, конфигурация с именем GPU применяется ко всем чипам с таким именем. Конфигурация с идентификатором GPU на PCI шине применяется только к одному GPU, т.к. идентификаторы на PCI шине уникальны для каждого устройства.
Инструмент для тестирования GPU и автоматической генерации файла настроек
Для тестирования нагрузочной способности GPU на сервере и автоматической генерации файла настроек предусмотрен специальный инструмент, который запускается следующим образом:
/usr/local/FlashphonerWebCallServer/tools/gpu_calibration_tool.sh sample.mp4 --separate-test --interval=20
Здесь:
- sample.mp4 - файл-источник видео для тестирования, должен содержать видео максимального разрешения, которое будет использоваться в эксплуатации, например, 1920x1080
- --separate-test - провести тестирование всех GPU, установленных на сервере и доступных операционной системе; если этот ключ не указан, проводится тест одного GPU, выбранного случайным образом
- --interval - интервал в секундах между тестами различных чипов
Инструмент проводит тестирование и создает файл настроек с максимальными параметрами GPU по результатам теста. Если тестируется несколько чипов, в настройках будут указаны их идентификаторы на PCI шине. Если тестируется только один чип (ключ --separate-test
не указан), в настройках будет имя GPU.
Если в сервер установлены разные GPU, и ключ --separate-test
не указан, будет протестировано по одному из GPU каждого типа
Во время тестирования WCS должен быть остановлен!
Изменение конфигурации кодирования/декодирования при изменении разрешения исходного потока
При публикации WebRTC потока разрешение может меняться в ходе публикации. Кроме того, при публикации потока скриншаринга, если захватывается какое-то окно на экране, разрешение также будет меняться при изменении размеров окна. При транскодинге такого потока на GPU, необходимо при каждом изменении разрешения менять параметры декодировщика. С настройками по умолчанию
hardware_acceleration_enable_soft_reconfiguration=true hardware_acceleration_reconfigure_max_width=1920 hardware_acceleration_reconfigure_max_height=1088
если разрешение снижается, меняются только настройки разрешения для декодирования. Если же разрешение увеличивается выше заданного порога, настройки декодирования будут сброшены, фактически декодер будет создан заново.
С настройкой
hardware_acceleration_enable_soft_reconfiguration=false
настройки декодирования будут сбрасываться при каждом изменении разрешения. Это может сильно повлиять на производительность.
Мониторинг
Текущую статистику использования GPU можно получить при помощи REST API.
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://streaming.flashphoner.com:8081/rest-api/gpu/info
- HTTPS: https://streaming.flashphoner.com:8444/rest-api/gpu/info
Здесь:
- streaming.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательный префикс
- /gpu/info - используемый REST-вызов
REST методы и статусы ответа
/gpu/info
Получить текущую статистику использования всех GPU
Request example
POST /rest-api/gpu/info HTTP/1.1 Host: localhost:8081 Content-Type: application/json
Response example
HTTP/1.1 200 OK Access-Control-Allow-Origin: * Content-Type: application/json { "cudaVersion": "12.4", "nvencVersion": "12.2", "driverVersion": "550.90.07", "nvmlVersion": "12.550.90.07", "numOfAvailableDevices": 1, "numOfDecodingSessions": 1, "numOfEncodingSessions": 5, "numOfHostEncodingSessions": 5, "deviceList": [ { "name": "Tesla P100-PCIE-16GB", "pciBusId": "0000:02:00.0", "computeCapability": "6.0", "computeMode": 0, "computeModeDescription": "Default compute mode (Multiple contexts allowed per device)", "numOfDecodingSessions": 1, "numOfEncodingSessions": 5, "numOfHostEncodingSessions": 5, "fpsStats": { "decoderFps": 30, "encoderFps": 30, "decoderFps2": 29, "encoderFps2": 29 }, "nativeEncoderStats": { "averageFps": 29, "averageLatency": 1225 }, "utilizationState": { "computeUtilization": 1, "memUtilization": 0, "decoderUtilization": 5, "encoderUtilization": 4, "totalMem": "16 GB", "freeMem": "15.26 GB", "usedMem": "752.25 MB", "usedPciBandwidth": "1.14 MB", "usedPciBandwidth2": "984.76 KB" }, "supportedEncodeCodecs": { "H265": { "minWidth": 65, "minHeight": 33, "maxWidth": 4096, "maxHeight": 4096 }, "H264": { "minWidth": 33, "minHeight": 17, "maxWidth": 4096, "maxHeight": 4096 } }, "supportedDecodeCodecs": { "H265": { "minWidth": 144, "minHeight": 144, "maxWidth": 4096, "maxHeight": 4096 }, "H264": { "minWidth": 48, "minHeight": 16, "maxWidth": 4096, "maxHeight": 4096 } } } ] }
Return codes
Code | Reason |
---|---|
200 | OK |
500 | Internal server error |
Параметры
Параметр | Описание | Пример |
---|---|---|
mediaSession | Объект описания сбора данных MEDIA_SESSION | "mediaSession": {"frequency":100, "ids":["12345678-0000-1111"]} |