iOS + GC problem

snark13

Member
Добрый день

Пробуем использовать сервер в одной из стандартных задач - показ RTSP стрима с камер на мобильные устройства и браузер по WebRTC.
Все работает прекрасно до момента когда приходит iOS клиент (проверялось как c iPad так и iPhone).
При приходе iOS клиента сервер начинает выжирать память и включается Garbage Collector который начинает использовать CPU неподобающе много (2-3 ядра заняты полностью только очисткой памяти) даже при всего лишь одной сессии от iOS устройства.
Проводили тесты на Амазоновских инстансах - на t3a.medium очистка памяти полностью загружает все два ядра (загрузка 200%), на t3a.xlarge - три ядра с небольшим из четырех (310-320%). Загрузка процессоров постоянна и остается даже после ухода клиента.
Памяти выделяли от 1 до 8 гигабайт (-Xmx8192M на t3a.xlarge) - не помогает.
Если используются десктоп браузеры или Android то такой проблемы не возникает.
В качестве плеера используется embedded_player.

Прошу прощения - запостил этот вопрос вначале в английскую ветку форума по ошибке - можно ее там удалить ?
 

Max

Administrator
Staff member
Добрый день.
Пожалуйста, уточните версию JDK, версию WCS, сборку WebSDK на сервере и версию iOS и Safari на устройствах, с которыми проводилось тестирование. Обратите внимание, что WebRTC в сторонних браузерах на iOS не поддерживается, может быть использован либо WSPlayer, либо HLS.
Также соберите отладочные логи по этой инструкции и вышлите на support@flashphoner.com
Сам по себе сборщик мусора не должен грузить процессор, это больше похоже на то, что для iOS клиентов включается транскодинг. Это можно проверить по странице статистики http://wcs:8081/?action=stat, раздел Native resources и Transcoding info:
Code:
-----Native Resources-----
native_resources=140545338103264,FFDecoderNative:H264/FFMPEG,332501631;57298992,RESAMPLER:48000/44100,882;40023424,NENC:H264/OPENH264,154054;140545021988896,mpeg4-generic,360448
native_resources.audio_codecs=1
native_resources.audio_resamplers=1
native_resources.video_transcoders=0
native_resources.video_decoders=1
native_resources.video_encoders=1
native_resources.writers=0
...
-----Transcoding info-----
transcoding_video_decoding_resolutions=1280x720/1;0x0/3;1280x960/1;1920x1080/1
transcoding_video_decoding_average_time=1280x720/3.0;0x0/-1.0;1280x960/-1.0;1920x1080/-1.0
transcoding_video_decoding_max_time=1280x720/3;0x0/-1;1280x960/-1;1920x1080/-1
transcoding_video_decoding_average_queue_size=1280x720/0.0;0x0/0.0;1280x960/0.0;1920x1080/0.0
transcoding_video_decoding_max_queue_size=1280x720/0;0x0/0;1280x960/0;1920x1080/0
transcoding_video_decoding_load=73420800
transcoding_video_encoding_resolutions=0x0/7
transcoding_video_encoding_average_time=0x0/0.2857142857142857
transcoding_video_encoding_max_time=0x0/2
transcoding_video_encoding_average_queue_size=0x0/0.0
transcoding_video_encoding_max_queue_size=0x0/0
transcoding_video_encoding_load=0
Если, например, вы захватываете RTSP поток 720p, транскодинг одного такого потока может занять одно ядро vCPU.
 

snark13

Member
FlashphonerWebCallServer-5.2.571-c7f4cee96db7330ea8a0b1f7828039f7e3028164
JDK -
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)

WebSDK - 0.5.28.2753-66cc3937a243293073ba1e6d00cfacc47251f2d7
iPhone 11, iOS 13.3.1

Проблема так же повторяется если использовать OS X Safart 13.1 (более свежую версию сейчас проверить не могу)
Логи и сетевые дампы были посланы. Особо странны логи GC.

Code:
-----Native Resources-----
native_resources=140357116422176,RESAMPLER:48000/8000,57390
native_resources.audio_codecs=0
native_resources.audio_resamplers=1
native_resources.video_transcoders=0
native_resources.video_decoders=0
native_resources.video_encoders=0
native_resources.writers=0
...
-----Version info-----
wcs_version=5.2.571-c7f4cee96db7330ea8a0b1f7828039f7e3028164
wcs_client_version=0.5.28.2753-66cc3937a243293073ba1e6d00cfacc47251f2d7
...
-----System Stats-----
system_java_cpu_usage=80.00
system_java_load_average=3.97
...
-----Transcoding info-----
transcoding_video_decoding_resolutions=0x0/1
transcoding_video_decoding_average_time=0x0/-1.0
transcoding_video_decoding_max_time=0x0/-1
transcoding_video_decoding_average_queue_size=0x0/0.0
transcoding_video_decoding_max_queue_size=0x0/0
transcoding_video_decoding_load=0
transcoding_video_encoding_resolutions=0x0/1
transcoding_video_encoding_average_time=0x0/0.0
transcoding_video_encoding_max_time=0x0/0
transcoding_video_encoding_average_queue_size=0x0/0.0
transcoding_video_encoding_max_queue_size=0x0/0
transcoding_video_encoding_load=0
 

snark13

Member
Проблема решилась сменой JDK OpenJDK11 на Oracle JDK 8 с переключением лога GC c -Xlog:gc на -Xloggc
(на Ubuntu 18.04 по умолчанию нет других JDK кроме OpenJDK - потому пришлось поначалу пробовать с тем JDK что шел из коробки)
 

Max

Administrator
Staff member
Добрый день.
Мы рекомендуем использовать JDK 8 или 12. JDK 12 на Ubuntu/CentOS можно установить при помощи следующего скрипта
Code:
#!/bin/bash
rm -rf jdk*
curl -s https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_linux-x64_bin.tar.gz | tar -zx
[ ! -d jdk-12.0.2/bin ] && exit 1
mkdir -p /usr/java
[ -d /usr/java/jdk-12.0.2 ] && rm -rf /usr/java/jdk-12.0.2
mv -f jdk-12.0.2 /usr/java
[ ! -d /usr/java/jdk-12.0.2/bin ] && exit 1
rm -f /usr/java/default
ln -sf /usr/java/jdk-12.0.2 /usr/java/default
update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk-12.0.2/bin/java" 1
update-alternatives --install "/usr/bin/jstack" "jstack" "/usr/java/jdk-12.0.2/bin/jstack" 1
update-alternatives --install "/usr/bin/jcmd" "jcmd" "/usr/java/jdk-12.0.2/bin/jcmd" 1
update-alternatives --install "/usr/bin/jmap" "jmap" "/usr/java/jdk-12.0.2/bin/jmap" 1
update-alternatives --set "java" "/usr/java/jdk-12.0.2/bin/java"
update-alternatives --set "jstack" "/usr/java/jdk-12.0.2/bin/jstack"
update-alternatives --set "jcmd" "/usr/java/jdk-12.0.2/bin/jcmd"
update-alternatives --set "jmap" "/usr/java/jdk-12.0.2/bin/jmap"
Также для версий JDK, поддерживающих ZGC, рекомендуем его использование. Для переключения на ZGC необходимо закомментировать в файле wcs-core.properties следующие строки
Code:
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
и добавить
Code:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
 

Max

Administrator
Staff member
Добрый день.
Мы протестировали работу сервера с JDK 14, проблема с подписчиками с iOS Safari также не воспроизводится.
 
Top