Масштабирование, конфигурация сервера

Warmor

New Member
Добрый день.
Делаем площадку для проведения вебинаров, столкнулись с проблемами масштабирования.
Когда кол-во пользователей стало превышать 1к подключений, увеличили диапазон портов, в документации сказано что диапазон не должен пересекаться с используемыми портами в системе, в разных темах вы советовали разные диапазоны (30001 - 40000, 20001-40000, 10001-50000), мы поставили такние настройки media_port_from = 11001 media_port_to = 28000
Но почему то в статистике (/?action=stat) отображается всего 8к портов.
Так же появилась проблема, когда кол-во подписчиков выросло до 2,6к переодически кол-во свободных портов (ports_media_free) падало до 0, и переодически страница статистики не отображалась, ну и само собой пользователи (новые) не могли подключится, у старых тем не менее стримы работали.

Почему кол-во свободных портов падало до 0 (диапазон пересекается с тем что использует система)?
Какой оптимальный должен быть диапазон портов?

И какие рекомендации по настройки сервера для максимального увеличения пользователей?
У нас довольно мощный сервер, а стримы транслируются в минимальном разрешении (360х240), в теории сервер должен выдерживать большое кол-во пользователей

Хор-ки сервера:
Процессор
2 × Intel Xeon Silver 4114 2.2 ГГц
Память
192 ГБ DDR4

#webrtc ports range
media_port_from =11001
media_port_to =28000
custom_ice_agent =true

#codecs
codecs =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,vp8,h264,flv,mpv
codecs_exclude_sip =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
codecs_exclude_sip_rtmp =opus,g729,g722,mpeg4-generic,vp8,mpv

#websocket ports
ws.port =8080
wss.port =8443

streaming_video_decoder_fast_start=true

mixer_layout_class=com.flashphoner.media.mixer.video.presentation.GridLayout
mixer_video_height=360
mixer_video_width=1920
mixer_video_grid_layout_middle_padding=0
mixer_video_grid_layout_padding=0
disable_rest_auth=true
#disable_rest_requests=false
http.port=8081
https.port=8444


inbound_video_rate_stat_send_interval=1
outbound_video_rate_stat_send_interval=1

webrtc_aes_crypto_provider=JCE
use_fdk_aac=true
client_subscribe_streams_max=20
### SERVER OPTIONS ###
# Set this property to false to disable session debug
-DsessionDebugEnabled=false
# Disable SSLv3
-Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"


### JVM OPTIONS ###
#-Xmx1024M
#-Xmx4096M
-Xms64g -Xmx64g
#-Xcheck:jni

# Can be a better GC setting to avoid long pauses
-XX:+UseConcMarkSweepGC -XX:NewSize=1024m
#-XX:NewSize=1024m
#-XX:+CMSIncrementalMode
#-XX:+UseParNewGC"

#Disable heuristic rules
-XX:+UseCMSInitiatingOccupancyOnly
#Reduce Old Gen threshold
-XX:CMSInitiatingOccupancyFraction=70

# Uncomment to fix multicast crosstalk problem when streams share multicast port
-Djava.net.preferIPv4Stack=true

# Default monitoring port is 50999. Make sure the port is closed on firewall. Use ssh tunel for the monitoring.
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=50999
-Dcom.sun.management.jmxremote.host=localhost
-Djava.rmi.server.hostname=localhost

-XX:ErrorFile=/usr/local/FlashphonerWebCallServer/logs/error%p.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:/usr/local/FlashphonerWebCallServer/logs/gc-core-
# Use System.gc() concurrently in CMS
-XX:+ExplicitGCInvokesConcurrent
# Disable System.gc() for RMI, for 10000 hours
-Dsun.rmi.dgc.client.gcInterval=36000000000
-Dsun.rmi.dgc.server.gcInterval=36000000000

# Proxy configuration
#-Dhttps.proxyHost=192.168.1.1
#-Dhttps.proxyPort=3128
#-Dhttp.proxyHost=192.168.1.1
#-Dhttp.proxyPort=3128
#-Dhttp.nonProxyHosts=localhost|127.0.0.1|10.*|169.254.169.254

-server
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAES
-XX:+UseAESIntrinsics
 

Max

Administrator
Staff member
Добрый день.
Какой оптимальный должен быть диапазон портов?
В вашем случае чем шире, тем лучше. Однако проблема не только в расходе медиа портов, которых, кстати, на 2600 подписчиков должно хватать.
Вы указываете число подписчиков, но не указываете число паблишеров. Скорее всего, у Вас забивается канал до сервера при 2600 подписчиков, т.к. при битрейте 300 кбит/с на поток 240p только им потребуется полоса в 780 Мбит. не считая паблишеров. Обратите также внимание на загрузку процессора во время пиковых нагрузок. Вы не указали, используется ли транскодинг, не отличаются ли кодеки у зрителей и паблишеров.
В любом случае, даже для потоков минимального разрешения для такого количества зрителей рекомендуется распределять нагрузку по нескольким серверам и переходить к CDN 1 Origin + 2 Edge сервера. Пожалуйста, посмотрите эту статью и документацию по CDN.
 

Warmor

New Member
В пике было 80 стримеров, канал был загружен в среднем на 860 Мбит (у нас 1000 лимит), процессор был загружен на ~ 35%.
То есть сервер выдерживал такую нагрузку, по каналу приближались к лимиту, но не уперлись в него.

Но проблема с портами остается,
На скриншотах видно что кол-во доступных портов в какой то момент упало до 0, при этом кол-во стримеров и подписчиков не сильно поменялось.

Снимок экрана 2020-05-22 в 17.24.12.png
Снимок экрана 2020-05-22 в 17.24.21.png
 

Max

Administrator
Staff member
Диапазон портов делится на два, потому что используются только четные порты.
Поэтому в мониторинге видно 8к свободных вместо 16к.

Подсистема раздачи портов может некоторое время проверять порты на занятость прежде чем вернуть их в пул свободных.
Поэтому под нагрузкой часть портов может уходить в "карантин", где они проходят проверки.
Можно увеличить диапазон портов в два раза. Если реальной утечки нет, это должно помочь.
Code:
media_port_from =11001
media_port_to =40000
В качестве тюнинга под высокими нагрузками, рекомендуется также установить Java 12 или Java 14 и ZGC.

Общие рекомендации по тюнингу сервера перед выходом в продакшен:
 
Top