Skip to content

Оптимизация Flussonic Media Server и операционной системы

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

Настройка UDP захвата

Flussonic автоматически меняет некоторые настройки сети, чтобы оптимизировать захват UDP источников, включая WebRTC и мультикаст. Чтобы отключить эту функцию, вы можете задать переменную окружения DO_NOT_DO_NET_TUNING и выполнить эти настройки вручную:

Чтобы передать переменную окружения DO_NOT_DO_NET_TUNING в Flussonic, выполните команду:

systemctl edit flussonic

В открывшийся файл добавьте строки:

[Service]
Environment="DO_NOT_DO_NET_TUNING=true"

Сохраните изменения.

Далее вам нужно увеличить размер памяти под UDP буферы:

sysctl -w net.core.rmem_max=1048576
sysctl -w net.core.rmem_default=1048576
sysctl -w net.ipv4.udp_mem="8388608 12582912 16777216"

Эти настройки будут работать до перезагрузки. Чтобы сохранить эти параметры навсегда, нужно отредактировать файл /etc/sysctl.conf.

В самый конец файла добавить:

net.core.rmem_max = 1048576
net.core.rmem_default=1048576
net.ipv4.udp_mem = 8388608 12582912 16777216

Чтобы применить изменения из файла, нужно выполнить команду:

sudo sysctl -p

Работа с большим количеством памяти

При наличии более 60 гигабайт памяти рекомендуется зарезервировать 10 гигабайт под Linux:

sysctl vm.min_free_kbytes=10240000

Настройка TCP/IP стека

Если вы используете Flussonic Media Server для вещания более чем на 3-4 Гбит/с для вас могут стать ощутимыми тонкости настройки TCP стека в Linux.

Во-первых, требуется увеличить количество доступной памяти для буферов соединений:

sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_wmem="4096 4194394 16777216"
sysctl -w net.ipv4.tcp_congestion_control=htcp
sysctl -w net.ipv4.tcp_slow_start_after_idle=0

Эти настройки будут работать до перезагрузки. Чтобы сохранить эти параметры навсегда, нужно отредактировать файл /etc/sysctl.conf, в самый конец файла вставить:

net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 4194394 16777216

Чтобы применить изменения из файла, нужно выполнить команду sudo sysctl -p.

Так же надо поменять настройки сетевого интерфейса: ifconfig eth0 txqueuelen 10000.

Обязательно надо проверить версию драйвера сетевой карты. Желательно использовать самую свежую версию. Выяснить версию драйвера и firmware можно так:

ethtool -i eth2
driver: ixgbe
version: 3.15.1
firmware-version: 0x61c10001
bus-info: 0000:04:00.0

Warning

При обновлении файла firmware в каталоге /lib/firmware необходимо перезагружать сервер. При этом может остаться старый firmware. Не забудьте запустить утилиту update-initramfs перед рестартом сервера.

Настройка сетевой карты

Прерывания сетевой карты

Современные 10-гигабитные сетевые адаптеры имеют несколько очередей для входящих и исходящих пакетов, которые иногда приходится вручную привязывать к ядрам процессоров.

Сервер на котором такую оптимизацию не сделали, обрабатывает всю сетевую подсистему на одном ядре. Выглядит это так:

cat /proc/interrupts
           CPU0   CPU1   CPU2   CPU3   CPU4   CPU5   CPU6   CPU7
  0:       2097      0      0      0      0      0      0      0  IR-IO-APIC      timer
...
 66: 2072120005      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-0
 67:    1562779      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-1
 68:    1830725      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-2
 69:    1504396      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-3
 70:    5112538      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-4
 71:    2229416      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-5
 72:    1686551      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-6
 73:    1217916      0      0      0      0      0      0      0  IR-PCI-MSI      eth2-TxRx-7
 74:       2358      0      0      0      0      0      0      0  IR-PCI-MSI      eth2

Для сетевых карт Intel производитель предлагает скрипт set_irq_affinity который раскидывает очереди по ядрам. После его запуска статистика прерываний выглядит так:

           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
  0:       2097          0          0          0          0          0          0          0  IR-IO-APIC  timer
...
 66: 2072120005          0          0          0          0          0          0          0  IR-PCI-MSI  eth2-TxRx-0
 67:    1562779 1162738082          0          0          0          0          0          0  IR-PCI-MSI  eth2-TxRx-1
 68:    1830725          0 1133908105          0          0          0          0          0  IR-PCI-MSI  eth2-TxRx-2
 69:    1504396          0     177620 1123678951          0          0          0          0  IR-PCI-MSI  eth2-TxRx-3
 70:    5112538          0          0          0 1638450740          0          0          0  IR-PCI-MSI  eth2-TxRx-4
 71:    2229416     130189          0          0          0 1441511712          0          0  IR-PCI-MSI  eth2-TxRx-5
 72:    1686551          0          0          0          0          0 1402472725          0  IR-PCI-MSI  eth2-TxRx-6
 73:    1217916          0          0      66145          0          0          0 1380402032  IR-PCI-MSI  eth2-TxRx-7
 74:       2358          0          0          0          0          0          0          0  IR-PCI-MSI  eth2

Эта настройка становится критичной примерно в районе 3-5 Гбит/с трафика.

Соединение со свичем

При соединении сетевой карты сервера со свичем, проверьте, что с обоих сторон установлены совместимые настройки. Т.е. с обеих сторон должно быть либо auto select, либо строго одинаковая скорость и дуплекс.

Оптимизация сервера для VOD вещания

Отдельный, более детальный раздел посвящен оптимизации сервера для вещания фильмов.

Перевод процессора в режим высокой производительности

Для экономии энергии в ОС Linux по умолчанию регулятор scaling_governor находится в режиме энергосбережения (powersave). В таком случае сервер не будет использовать все свои аппаратные ресурсы. Чтобы сервер работал в режиме высокой производительности, необходимо:

Отключить регулятор ondemand:

systemctl disable ondemand

Перезагрузить сервер:

reboot

Проверить текущее значение scaling_governor:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor