SRT Tests und Verhalten im Lastbereich

SRT = Secure Reliable Transport
Zum Test benutzte Server: s0005 – s0007.
Alle von Hand mit 18.04 installiert (kein Puppet).

SRT Installation:

apt update && apt upgrade -y
wget -O srt.zip https://github.com/Haivision/srt/archive/master.zip
apt install -y screen psmisc tcpdump unzip tclsh pkg-config cmake libssl-dev build-essential
unzip srt.zip
cd srt-master
./configure
make
make install
reboot

(reboot nur, wenn es beim Update am Anfang einen neuen Kernel gab)

Folgender Versuchsaufbau:
Mit 2 Servern (5+6)
ffmpeg streamt File nach 127.0.0.1:6001

Es werden 80 SRT Sender in Screens gestartet (start-sender.sh 80), alle erwarten eingangsseitig ´den Stream auf 6001 und senden ihn dann an 80 SRT Empfänger auf einem anderen Server (start-receiver.sh 80).
Dort werden die Streams entgegen genommen und als File weggeschrieben.

Erste Erkenntnis: Die SRT Sender locken den Port bez. abhören. Wenn 80 Sender gestartet werden, überträgt nur 80 den Stream, die anderen Sender sehen ihn noch nicht einmal.
Aber: Wird 80 gekillt, übernimmt direkt 79 für ihn und schreibt nahtlos weiter weg.
Das könnte für Redundanz und Skalierung sehr interessant sein. Leider funktioniert der Massentest auf diese Art nicht.

Nächster Versuch ist ffmpeg als Multicast streamen zu lassen.

#####

ffmpeg, wie auch GStreamer setzen beide den Einsatz eines Demuxers voraus, damit wird der Stream prozessiert und der übertragene Stream ist nicht mehr 1 zu 1 identisch zum Ausgangsmaterial. Dies ist im Hinblick auf einen Checksummenvergleich ungünstig.

Folgender Versuchsaufbau für Multicast:
eth1 der Server 5-7 für internen Traffic konfigurieren
route für Multicast
route add -net 224.0.0.0 netmask 240.0.0.0 eth1

UFW Config:
ufw allow in proto udp to 224.0.0.0/4
ufw allow in proto udp from 224.0.0.0/4

und folgende Zeilen in /etc/ufw/before.rules einfügen:

# allow IGMP
-A ufw-before-input -p igmp -d 224.0.0.0/4 -j ACCEPT
-A ufw-before-output -p igmp -d 224.0.0.0/4 -j ACCEPT

ufw reload hat zwar keine Fehler gemeldet, aber auch nicht wie erwartet funktioniert. Nach langer Fehlersuche als Verzweiflungstat den UFW komplett deaktiviert und es ging. Wieder aktiviert und es ging immer noch.

s0005 simuliert einen IRD. Ausgabe von Stream als Multicast, in einer screen Session mittels ffmpeg.

s0006 simuliert den/die SRT Empfänger (zu starten bevor die Sender gestartet werden).
Für Massentests wurde ein kleines Script erzeugt:

#!/bin/bash
for (( i=1; i<=$1; i++ ))
do
        y=$(seq -f "%02g" $i $i)
        screen -d -m -S receiver$y bash -c "cd /;stransmit srt://:50$y file://con -f > /mnt/data/test$y.ts"
done
screen -ls

Zu starten mit ./start-receivers.sh ZAHL, wobei Zahl die Anzahl der zu startenden Empfänger angibt.
Die Empfangenen Streams werden nach /mnt/data/test* weggeschrieben.
Vor einem Test müssen alle Empfänger gestoppt und neu gestartet werden, um vergleichbare Files zu erhalten (killall screen).

s0007 simuliert den Feeder, bzw. Multicast Receiver/ SRT Sender.
Zu starten mit ./start-senders.sh ZAHL, wobei Zahl die Anzahl der zu startenden Empfänger angibt.

#!/bin/bash
for (( i=1; i<=$1; i++ ))
do
        y=$(seq -f "%02g" $i $i)
        screen -d -m -S sender$y bash -c "cd /;stransmit udp://@239.0.0.1:6001?adapter=10.20.0.7 srt://s0006.ntrm.de:50$y -s:500"
done
screen -ls

Vor einem Test müssen alle Sender gestoppt und neu gestartet werden, da die Empfänger gestoppt und gestartet werden müssen (killall screen).

Die genauen Ergebnisse sind Verschlusssache, aber es funktioniert und das sehr gut. Wer es selbst durchspielen möchte sollte hier alles gefunden haben, was er dazu braucht.

Related Post