Рекомендации по тонкой настройке сервера¶
Настройки сервера по умолчанию в большой степени универсальны и могут нуждаться в подстройке под определенный сценарий клиента.
Настройка REST клиента¶
При использовании REST hooks, на каждое действие WCS сервера (присоединение клиента, публикация и воспроизведение потока, установка звонка и т.д.) создается HTTP REST соединение к бэкенд-серверу. При большом количестве одновременно публикующих клиентов или подписчиков, при настройках по умолчанию возможно исчерпание пула потоков встроенного REST клиента WCS, что, в свою очередь, может приводить к блокировкам (deadlock). При этом сервер перестает публиковать и воспроизводить потоки.
По умолчанию, максимальное количество одновременных REST соединений установлено в 200 при помощи параметра в файле flashphoner.properties
Для того, чтобы избежать переполнения пула потоков и блокировок, необходимо уменьшить это значение, например
Если REST hooks не используются, REST клиент может быть отключен при помощи настройки
Ограничение логирования¶
При использовании REST hooks в серверный лог записывается работа REST-клиента, работа встроенного бэкенда EchoApp, а также работа REST API сервера. Это приводит к большому количеству записей в лог и, следовательно, увеличивает нагрузку на сервер. При необходимости, объем логирования может быть уменьшен при помощи следующих параметров в файле log4j.properties:
Настройка UDP¶
При стриминге медиаданные передаются UDP-пакетами. UDP-пакеты могут отбрасываться, если, например, сервер не успевает разобрать очередь пакетов, что ведет к ухудшению качества изображения, фризам. Для того, чтобы этого избежать, необходимо подстроить буферы UDP-сокетов настройками в файле flashphoner.properties
а также настроить системные очереди командой
Для того, чтобы диагностировать проблему с UDP, необходимо отследить сброс UDP-пакетов командой
Настройка буферов UDP на уровне системы¶
Если на сервере публикуются потоки с высоким битрейтом, и для публикации и проигрывания используется UDP (например, в качестве транспорта внутри CDN), может потребоваться настройка буферов UDP на уровне системы
При этом производительности сервера должно хватать для обработки всех поступающих пакетов трафика. В противном случае качество трансляции ухудшится (появятся фризы), но узким местом станет не сеть, а CPU.
Оптимизация загрузки канала¶
Качество картинки при воспроизведении у пользователя зависит от битрейта: чем выше битрейт, тем выше качество. Однако, чем выше битрейт, тем больше загружается канал передачи данных, и, если полоса пропускания между сервером и клиентами ограничена, есть вероятность, что канал будет загружен полностью. Это приводит к сбросу битрейта и резкому снижению качества картинки.
В связи с этим, необходимо ограничивать битрейт для того, чтобы обеспечить достаточное качество картинки при приемлемой загрузке канала.
Ограничение битрейта при публикации¶
Для снижения нагрузки на канал от публикующей стороны до сервера можно задать минимальное и максимальное значения битрейта в кбит/с в скрипте публикации при помощи JavaScript API
session.createStream({
name: streamName,
display: localVideo,
constraints: {
video: {
minBitrate: 500
maxBitrate: 1000
}
}
...
}).publish();
Ограничение битрейта на сервере¶
Минимальное и максимальное значение битрейта в бит/с на сервере устанавливается следующими настройками в файле flashphoner.properties
Также нужно включить декодирование потоков на сервере только по запросу, для снижения нагрузки на сервер
Изменение диапазона динамических портов в Linux¶
Динамический или эфемерный порт, — временный порт, открываемый при установке IP-соединения из определённого диапазона программного стека TCP/IP. Многие версии ядра Linux используют в качестве динамических порты 32768 — 61000. Проверить, какой именно диапазон используется на сервере, можно при помощи команды
Если этот диапазон пересекается со стандартными портами, используемыми WCS, его необходимо изменить при помощи команды
Изменение максимального количества открытых файлов¶
Устаревший способ (сборки до 5.2.762)¶
В скрипте запуска webcallserver, расположенном в подкаталоге bin в каталоге установки WCS, например
в функции start() указано значение максимального количества открытых файлов
function start() {
...
echo -n $"$PRODUCT: starting"
ulimit -n 20000
if [[ "$1" == "standalone" ]]; then
...
fi
...
}
По умолчанию, данное значение установлено в 20000, но при необходимости его можно увеличить, учитывая ограничения используемой операционной системы.
Использование переменных среды (начиная со сборки 5.2.762)¶
Начиная со сборки 5.2.762, максимальное количество открытых файлов может быть настроено при помощи переменной
в файле setenv.sh
. При обновлении с предыдущей сборки, желаемое значение
необходимо добавить в этот файл вручную, например
В отличие от скрипта запуска webcallserver
, файл setenv.sh
при
последующих обновлениях не перезаписывается, таким образом, нет
необходимости при каждом обновлении восстанавливать эту настройку.
Использование параметров сервиса при запуске от непривилегированного пользователя (начиная со сборки 5.2.801)¶
Начиная со сборки 5.2.801, WCS запускается от пользователя 'flashphoner' для большей безопасности. В этом случае изменение максимального количества открытых файлов возможно в параметрах сервиса
Количество открытых файлов задается параметром LimitNOFILE
, например
Команда для изменения максимального количества открытых файлов¶
В сборке 5.2.1255 добавлена команда для изменения максимального количества открытых файлов
При этом WCS будет остановлен перед внесением изменений в настройки и автоматически запущен после внесения изменений.
Если указано меньшее количество, чем значение по умолчанию (20000), будет выведено сообщение об ошибке, и изменения не будут применены.
Шифрование в отдельном потоке для каждой клиентской сессии¶
По умолчанию, шифрованием трафика для всех клиентских сессий занимается один процессорный поток. Это приводит к тому, что на маломощных серверах при большом количестве подписчиков такой поток нагружает одно процессорное ядро, после чего сервер не успевает рассылать медиапакеты подписчикам, и начинается деградация воспроизводимых потоков, снижение FPS и фризы.
Чтобы распределить нагрузку равномерно по ядрам процессора, необходимо включить шифрование трафика в отдельном процессорном потоке для каждой из клиентских сессий при помощи следующих настроек
rtp_paced_sender=true
rtp_paced_sender_initial_rate=200000
rtp_paced_sender_increase_interval=50
rtp_paced_sender_k_up=0.9
и перезапустить WCS.
Оптимизация доставки потока подписчикам¶
При большом количестве подписчиков на один поток (от 100 и более) качество воспроизведения потока может падать: низкий FPS, фризы. При этом нагрузочной способности сервера и канала может быть достаточно. В таких случаях рекомендуется включить распределение доставки потока подписчикам по процессорным потокам при помощи настройки
При этом клиентские аудио и видео сессии распределяются по группам.
Максимальное количество видео сессий в группе задается настройкой
Максимальное количество аудио сессий в группе задается настройкой
Размеры очередей пакетов на группу и максимальное время ожидания фрейма для отправки (в миллисекундах) задаются настройками
streaming_distributor_subgroup_queue_size=300
streaming_distributor_subgroup_queue_max_waiting_time=5000
для видео и
streaming_distributor_audio_subgroup_queue_size=300
streaming_distributor_audio_subgroup_queue_max_waiting_time=5000
для аудио соответственно.