Падает flashphoner при 10-15 одновременных стримах

Vadimmiras

New Member
Добрый день!
Организовали инстанс на EC2 для записи стримов, пик нагрузки примерно 100 одновременных стримов, но большую часть времени число от 10 до 30.
Инстанс c5.4xlarge, но после нескольких часов работы несколько ядер начинают грузиться в 100%, в настройках ядра увеличена память для heap - Xmx и Xms стоят в 16гб. Заметил тенденцию, что при 18 гб из 32 доступных флешфонер перестает отвечать. Прошу помочь.
 

Max

Administrator
Staff member
Пришлите пожалуйста report или сразу SSH доступ к серверу

Report

Прислать можно по кнопке "Report", расположенной справа сверху.

При большом количестве одновременно записываемых стримов может не хватать IO диска и данные будут скапливаться в очередях. Поэтому в пиках может происходить похожее поведение. С другой стороны, ядро процессора может работать недостаточно быстро при нормальном дисковом iops и в итоге очереди будут долго разгребаться и нагружать память

Общие рекомендации:
1) Рассмотреть инстансы с выделенным iops чтобы исключить узкое место на диске.
2) Попробовать настройки

file_recorder_thread_pool_max_size =16
file_recorder_thread_pool_max_size =32
file_recorder_thread_pool_max_size =64
file_recorder_thread_pool_max_size =128

По-умолчанию 4

Эта настройка позволяет ускорить разгребание данных в очереди на запись и ускорить запись за счет увеличения потребления CPU. Тем самым снизить нагрузку на память из-за которой мог произойти выход сервера по причине OutOfMemory
 

Vadimmiras

New Member
в report отправил данные для подключения через ssh, посмотрите пожалуйста.
 

Vadimmiras

New Member
Так же пытался настроить ZGC для увеличения производительности, но почему то все равно работал GC, jdk стоит 14 версии, как раз из маркетплейса развертка
 

Max

Administrator
Staff member
Мы проверили сервер.
Рекомендации будут такими же, что и в этой теме (английский, речь о тестировании одновременной записи стримов на слабом инстансе, с записью файлов на NFS-том:
1. Включить запись с моно звуком, это уменьшит нагрузку на процессор:
Code:
record_audio_codec_channels=1
2. Увеличить количество процессорных потоков, используемых при записи на диск
Code:
file_recorder_thread_pool_max_size=8
Данная величина подбирается опытным путем, для инстанса t3a.medium оказалось достаточно 8, для c5.4xlarge можно задать и больше, но не более 64. Это позволит снизить потребление памяти и равномернее распределить нагрузку по процессорным ядрам.
Также рекомендуем все же включить ZGC по этой инструкции, Вам нужно убрать из wcs-core.properties строки
Code:
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
и добавить строку
Code:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms14g -Xmx14g
Использование hugepages можно не настраивать, большого выигрыша это не даст.
 

Vadimmiras

New Member
Хорошо, спасибо!
А сколько мощности надо для одновременной записи ~100 стримов? С учётом того, что зрителей нет, только сама запись
 

Max

Administrator
Staff member
А сколько мощности надо для одновременной записи ~100 стримов? С учётом того, что зрителей нет, только сама запись
Таких тестов мы пока не проводили. В данном случае процессор будет потреблять транскодинг звука, если публикуются WebRTC H264+Opus стримы, и собственно запись. В теории, Вашей конфигурации должно быть достаточно, мы запланируем тесты.
 

Max

Administrator
Staff member
Добрый день!

По результатам тестов:
Тестовое окружение:
  • Инстанс c5.4xlarge,
  • WCS версии 5.2.929 ,
  • Jdk version "14.0.1" ,
  • Java Heap 16 GB,
  • ZGC включен.

Настройки в файлах flashphoner.properties и wcs-core.properties:
Code:
#server ip
ip                     =
ip_local               =

#webrtc ports range
media_port_from        =31001
media_port_to          =40000

#codecs
codecs                   =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,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

wcs_activity_timer_timeout=86400000
wcs_agent_port_from=44001
wcs_agent_port_to=55000

zgc_log_parser_enable=true
global_bandwidth_check_enabled=true

stream_record_policy_template={streamName}

record_audio_codec_channels=1
file_recorder_thread_pool_max_size=8
Code:
### 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 ###
-Xmx16g
-Xms16g
#-Xcheck:jni

# Can be a better GC setting to avoid long pauses

#-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

-Xlog:gc*:/usr/local/FlashphonerWebCallServer/logs/gc-core-:time
# ZGC
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

# 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

#List of caught system signals
#-DsignalHandlers=ABRT
#-DsignalHandlersLogBufferSize=1048576
По результатам теста нашли узкое место - дисковое пространство инстанса.
По умолчанию, при создании инстанса c5.4xlarge AWS предоставляет диск размером всего 8 GB, этого диска мало для хранения записей.
На графиках можно увидеть, что, через некоторое время при работе записи, диск заполняется на 100%, что в свою очередь, приводит к сбоям в работе WCS:
1617957946802.png


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

Vadimmiras

New Member
Разумеется, поэтому у нас в качестве хранилища используется io2 ssd на 200гб с максимальным iops = 32000, а при достижении 175гб видео - rclone перекидывает файлы на гуглдиск. В итоге проблем с памятью нет
 
Top