85 participants successful meeting with audio only and screen sharing

Hello,

Here is my experience for a successful meeting with 85 participants in one room with audio only and screen sharing.
I would appreciate your remarks and suggestions for a better optimization.

TLTR : Very good user experience. Good job, Jitsi Team !

We had a small problem :
The moderator activated “Everyone follows me” in his profile and shared his screen. Everything was ok, but if someone else was talking, the view came back to mosaic view.
Problem of configuration or a bug ? Any idea ?

The details :

Harware (7 years old…) : 8 cores Intel Xeon CPU E3-1230 v3 3.30GHz, 32 Gb RAM, HDD.
Full specs : https://support.hpe.com/hpesc/public/docDisplay?docId=emr_na-c03792388
Software : Debian 11 bullseye, LAMP stack, full mail stack (MDA, LDA, anti-virus, anti-spam…) and many other satellite softs.
Jitsi Docker version stable-5142 (Jitsi 2.1.376-g9f12bfe2)

With 85 people :

  • CPU : Peak around 30% (22% user, 7% system), around 10% percent is for non Jitsi softs.
    All load is very well spread across all cores.
  • RAM : low consumption (2-3 Gb)
  • Network : IN 7 Mb/s max, OUT 42 Mb/s max
  • RTT very good

No bottleneck seen during the meeting.
With this server and configuration, I think we can host 200 users.

To do that, I did a lot of tuning :

Kernel config :

net.core.rmem_max=10485760
net.core.netdev_max_backlog=100000

.env custom config :

ENABLE_PREJOIN_PAGE=false
START_AUDIO_ONLY=true
START_AUDIO_MUTED=0
START_VIDEO_MUTED=0
ENABLE_REQUIRE_DISPLAY_NAME=true
RESOLUTION_MIN=180
RESOLUTION_WIDTH=720
RESOLUTION_WIDTH_MIN=240
LOG_LEVEL=warn

And many config files adjustments to :

  • decrease logs verbosity on server and client Javascript console
  • keep client experience smooth
sed -i "s/DISABLE_DOMINANT_SPEAKER_INDICATOR: false,/DISABLE_DOMINANT_SPEAKER_INDICATOR: true,/g" ./jitsi-meet/interface_config.js
sed -i "s/DISABLE_JOIN_LEAVE_NOTIFICATIONS: false,/DISABLE_JOIN_LEAVE_NOTIFICATIONS: true,/g" ./jitsi-meet/interface_config.js
sed -i "s/DISABLE_FOCUS_INDICATOR: false,/DISABLE_FOCUS_INDICATOR: true,/g" ./jitsi-meet/interface_config.js
sed -i "s/DISABLE_VIDEO_BACKGROUND: false,/DISABLE_VIDEO_BACKGROUND: true,/g" ./jitsi-meet/interface_config.js
sed -i "s/GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,/GENERATE_ROOMNAMES_ON_WELCOME_PAGE: false,/g" ./jitsi-meet/interface_config.js
sed -i "s/RECENT_LIST_ENABLED: true,/RECENT_LIST_ENABLED: false,/g" ./jitsi-meet/interface_config.js
sed -i "s/HIDE_DEEP_LINKING_LOGO: false,/HIDE_DEEP_LINKING_LOGO: true,/g" ./jitsi-meet/interface_config.js
sed -i "s/'closedcaptions',//g" ./jitsi-meet/interface_config.js
sed -i "s/'download',//g" ./jitsi-meet/interface_config.js
sed -i "s/'embedmeeting',//g" ./jitsi-meet/interface_config.js
sed -i "s/'feedback',//g" ./jitsi-meet/interface_config.js
sed -i "s/'filmstrip',//g" ./jitsi-meet/interface_config.js
sed -i "s/'help',//g" ./jitsi-meet/interface_config.js
sed -i "s/'recording',//g" ./jitsi-meet/interface_config.js
sed -i "s/'livestreaming',//g" ./jitsi-meet/interface_config.js
sed -i "s/'etherpad',//g" ./jitsi-meet/interface_config.js
sed -i "s/'invite',//g" ./jitsi-meet/interface_config.js
sed -i "s/'sharedvideo',//g" ./jitsi-meet/interface_config.js
sed -i "s/'videobackgroundblur',//g" ./jitsi-meet/interface_config.js
sed -i "s/'camera',//g" ./jitsi-meet/interface_config.js
sed -i "s/'shortcuts',//g" ./jitsi-meet/interface_config.js

jicofo config

docker-compose -f docker-compose.yml --env-file .env exec jicofo /bin/bash -c "sed -i \"s/.level=INFO/.level=WARNING/g\" /config/logging.properties"
docker-compose -f docker-compose.yml --env-file .env exec jicofo /bin/bash -c "sed -i \"s/java.util.logging.ConsoleHandler.level = ALL/java.util.logging.ConsoleHandler.level = OFF/g\" /config/logging.properties"

jvb config

docker-compose -f docker-compose.yml --env-file .env exec jvb /bin/bash -c "sed -i \"s~.level=INFO~.level=WARNING~g\" /config/logging.properties"
docker-compose -f docker-compose.yml --env-file .env exec jvb /bin/bash -c "sed -i \"s~java.util.logging.ConsoleHandler.level = ALL~java.util.logging.ConsoleHandler.level = OFF~g\" /config/logging.properties"
docker-compose -f docker-compose.yml --env-file .env exec jvb /bin/bash -c "sed -i \"s~org.jitsi.videobridge.STATISTICS_TRANSPORT=muc~org.jitsi.videobridge.STATISTICS_TRANSPORT=colibri\norg.jitsi.videobridge.STATISTICS_INTERVAL=60000\norg.jitsi.videobridge.rest.private.jetty.port=-1\norg.jitsi.videobridge.rest.jetty.port=8080\norg.jitsi.videobridge.rest.jetty.host=0.0.0.0~g\" /etc/jitsi/videobridge/sip-communicator.properties"
docker-compose -f docker-compose.yml --env-file .env exec jvb /bin/bash -c "sed -i \"s/\# VIDEOBRIDGE_MAX_MEMORY=3072m/VIDEOBRIDGE_MAX_MEMORY=8192m/g\" /usr/share/jitsi-videobridge/lib/videobridge.rc"

web config

docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// disableAudioLevels: false,~disableAudioLevels: true,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s/enableNoAudioDetection: true,/enableNoAudioDetection: false,/g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s/enableNoisyMicDetection: true,/enableNoisyMicDetection: false,/g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// disableH264: false,~disableH264: true,~\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~        disableH264: true,~~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// e2eping: {~e2eping: {pingInterval: -1,analyticsInterval: -1},~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// apiLogLevels: ['warn', 'log', 'error', 'info', 'debug'],~apiLogLevels: ['error'],~g\" /defaults/config.js"
# Jitsi nginx is behind our proxy nginx, so no logs in Jitsi nginx.
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~access_log /dev/stdout;~access_log off;~g\" /defaults/nginx.conf"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~defaultLogLevel: 'trace',~defaultLogLevel: 'error',~g\" /usr/share/jitsi-meet/logging_config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// disableLogCollector: true,~disableLogCollector: true,~g\" /usr/share/jitsi-meet/logging_config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~'modules/RTC/TraceablePeerConnection.js': 'info',~'modules/RTC/TraceablePeerConnection.js': 'error',~g\" /usr/share/jitsi-meet/logging_config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~'modules/statistics/CallStats.js': 'info',~'modules/statistics/CallStats.js': 'error',~g\" /usr/share/jitsi-meet/logging_config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~'modules/xmpp/strophe.util.js': 'log'~'modules/xmpp/strophe.util.js': 'error'~g\" /usr/share/jitsi-meet/logging_config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// startAudioOnly: false,~startAudioOnly: true,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// startWithAudioMuted: false,~startWithAudioMuted: true,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// startAudioMuted: 10,~startAudioMuted: 0,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// maxFullResolutionParticipants: 2,~maxFullResolutionParticipants: 0,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// enableLayerSuspension: false,~enableLayerSuspension: true,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// startVideoMuted: 10,~startVideoMuted: 0,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~// startWithVideoMuted: false,~startWithVideoMuted: true,~g\" /defaults/config.js"
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~channelLastN: -1,~channelLastN: 5,~g\" /defaults/config.js"
# Disable camera shortcut
docker-compose -f docker-compose.yml --env-file .env exec web /bin/bash -c "sed -i \"s~this._initGlobalShortcuts(),~this._initGlobalShortcuts(),this.enable(0),~g\" /usr/share/jitsi-meet/libs/app.bundle.min.js"

The nginx master (proxy for Jitsi nginx) is well tuned (cache, threads…), especially for log writings :

access_log /var/log/nginx/access-jitsi.log combined buffer=1m flush=5m;
error_log /var/log/nginx/error-jitsi.log warn;

// The proxy section :
location / {
        proxy_pass http://127.0.0.1:6181;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
}

Emmanuel.

4 Likes