Upload Traffic überwachen > wenn zu gering > batch ausführen



  • @SeppJ
    Das bleibt so. Wie gesagt, ich habe die Streaming PCs wirklich nur zum streamen. Ich habe vor, die Stream dort laufen zu lassen und wenn alles läuft muss ich da am besten nie wieder dran 🙂

    Naja, rein logisch gesehen dürfte dort eigentlich gar nicht gesendet werden. OBS (der letzte PC - letzter Screenshot) hat eine RTSP-Quelle. Die sendet ja zum PC hin, also eine Art Download. Raus geht doch eigentlich nur der Upload aus OBS. Versteh ich nicht.

    Screenshot Taskmanager
    Da seh ich jetzt gerade noch, dass ich ja mit RemoteDesktop auf die PC zugreife. Da entsteht natürlich auch Traffic.
    Ich werde das ganze jetzt nochmal direkt am PC und ohne RemoteDesktop testen...
    Ich danke auch an dieser Stelle schon mal mega für eure Zeit - ich probier jetzt mal etwas rum (PCs stehen im Keller) und schreib dann nochmal.


  • Mod

    @dreamer84 sagte in Upload Traffic überwachen > wenn zu gering > batch ausführen:

    @Schlangenmensch
    Hab ich gemacht...
    Komisch, wenn der Stream läuft oder nicht läuft kommen Werte zwischen 200 und 4.000
    Der streamt doch aber laut OBS aber schon mit 5.000 kb/s

    Bist du sicher, dass es nicht 5000 k Bit/s sind?



  • So ich hab mal noch etwas rumprobiert und alles ohne RemoteDesktop getestet:
    Bei deaktiven Stream liegt der Traffic bei 1-25. Bei aktiven Stream bei 100-4000.
    Da sind also schon mal Werte mit denen man was anfangen kann.

    Eine Idee hatte ich noch. Wenn ich das Script ausführe gibt er ja nur den aktuell gemessenen Wert zurück. Der schwankt eben sehr stark. Wäre es sinnvoll eine Art Durchschnittswert aus den letzten 10 Sekunden zu errechnen? also 10 Sekunden lang messen und dann eben einen Mittelwert ausgeben? Ich denke diese Zahl wäre sehr viel verlässlicher.

    Wie könnte das aussehen?
    Ich weiß beim Arduino lief das über eine Art "Frequenz Counter". Kann man sowas da mit einbauen?



  • @dreamer84 ja, geht natürlich. Abhängig von der Zeit oder einfach der Durchschnitt von 10 Messungen, oder oder oder.

    Ich bin gerade noch über Get-Counter gestolpert. Damit könnte man vlt abgestimmt auf die Streaming Software Monitoren und hätte damit vielleicht das Problem mit dem Hintergrundrauschen behoben.



  • @Schlangenmensch
    Ja, das klingt gut. Was wäre sinnvoller? Einen Counter der einfach 10 Sekunden lang misst, oder?

    Hast du eine Ahnung wie man das in den Code einbaut?



  • @dreamer84 Ich bin sicher, mit ein bisschen Google Unterstützung hättest du das auch schnell selbst gefunden, aber weil Freitag ist und ich gerade ein bisschen Spaß am Googeln hatte:

    $threshold = 1000
    $timer = new-timespan -Seconds 10
    $wmi = 0
    $count = 0
    $clock = [diagnostics.stopwatch]::StartNew()
    while ($clock.elapsed -lt $timer){
        $wmi += (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesSentPerSec).BytesSentPerSec
        $count++
    }
    
    $kbytes = ($wmi/$count)  / 1kb * 8 #to kbit/s 
    
    if($kbytes -le $threshold)
    {
        Write-Output $kbytes
        Write-Host "restart"
    }
    else    
    {
        Write-Output $kbytes
        Write-Host "all ok"
    }
    

    Ich habe das ganze jetzt in kbits umgerechnet (siehe die *8), ich denke das sollte deine Erwartungen besser treffen.
    Aber wie gesagt, ich Google mir das auch nur zusammen.

    Wenn man 10 Sekunden lang abfragt, weiß man halt nicht wie viele Durchläufe man schafft. Das hängt dann vom System ab. Immer eine bestimmte Anzahl zu nehmen wäre halt überall die gleiche Anzahl. Aber, deine Entscheidung.



  • @Schlangenmensch
    Glaub mir, ich saß bis heute morgen um 4 Uhr um da selbst noch was dran zu machen.
    Das Problem ist nicht den Befehl bei Google zu finden, aber wenn man damit noch nie was zutun hatte ist es gar nicht so leicht sowas mit anderen Befehlen richtig zu kombinieren.

    Ich danke dir vielmals für deinen Code 😃
    Ich werde ihn direkt ausprobieren.



  • Mega!
    Der Code funktioniert jetzt absolut zuverlässig 😃
    Die Bitrate entspricht ziemlich genau der, die OBS anzeigt - ca. 5500.
    Bei inaktivem Stream sinkt sie auf ca. 20.
    So kann man das ganz klar Trennen wenn der Stream läuft oder abgestürzt ist.

    Ich danke dir vielmals.
    Ich würde dir gern einen Kaffee spendieren für deine Zeit und deine Mühe.
    Kannst du mir eine PN schicken?



  • PMs sind hier aus gutem Grund deaktiviert 😉

    Seh es als Freundschaftsdienst, für sowas sind Foren da.

    Wenn du unbedingt Geld los werden möchtest, kannst du den Kaffebetrag gerne an eine gemeinnützige Organisation spenden.



  • @Schlangenmensch sagte in Upload Traffic überwachen > wenn zu gering > batch ausführen:

    while ($clock.elapsed -lt $timer){
        $wmi += (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesSentPerSec).BytesSentPerSec
        $count++
    }
    

    Ich denke es wäre gut da noch eine "sum" Aggregierung einzubauen und wenigstens etwas wie ein "sleep 100ms".



  • Vielleicht ist es auch noch sinnvoll, sich den letzten Wert zu merken und nur bei fallender Flanke den Prozess neu zu starten?
    Nur für den Fall, dass die Software zum Starten etwas länger braucht und dabei vom Watchdog abgeschossen und neu gestartet wird?



  • @Schlangenmensch
    Vielen Dank dafür.
    Ich habe soeben einen kleinen Betrag an die Deutsche Krebshilfe gespendet.

    @hustbaer
    Danke für deinen Hinweis.
    Was macht ein "sum" Aggregierung?

    Den Begriff Watchdog hab ich in einem anderen Zusammenhang schon mal gehört. Ich hatte damals versucht etwas drüber herauszufinden aber nichts dazu gefunden. Kannst du mir sagen was das genau ist?

    Ich finde es aktuell eigentlich schon nahezu perfekt. Der Batch wird alle 5 Minuten vom Taskplaner ausgeführt. Wenn der Stream nicht läuft, startet er ihn einfach neu... dadurch, dass ich zwei Stream für ein Ziel laufen habe, also einen Backup stream die ganze Zeit mitsende, macht es auch nichts, wenn innerhalb der 5 Minuten einer der Streams abstürzt...

    $threshold = 100
    $timer = new-timespan -Seconds 10
    $wmi = 0
    $count = 0
    $clock = [diagnostics.stopwatch]::StartNew()
    while ($clock.elapsed -lt $timer){
        $wmi += (Get-WMIObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | Select-Object BytesSentPerSec).BytesSentPerSec
        $count++
    }
    
    $kbytes = ($wmi/$count)  / 1kb * 8 #to kbit/s 
    
    
    if($kbytes -le $threshold)
    {
        Write-Output $kbytes
        Write-Host "restart"
    	taskkill /f /im obs64.exe
    	Start-Process -FilePath "obs64.exe" -WorkingDirectory "C:\Program Files\obs-studio\bin\64bit\" --startstreaming
    }
    else    
    {
        Write-Output $kbytes
        Write-Host "all ok"
    }
    


  • Achso, wenn das Überwachungsintervall 5min sind, dann ist mein Einwand hinfällig.
    Ein Watchdog ist ein Wachhund, der auf irgendwas aufpasst und Alarm schlägt, wenn etwas nicht so ist, wie es sein sollte. In deinem Fall ist das Skript der Watchdog, der guckt regelmäßig auf den Upstream-Durchsatz und schlägt Alarm (=startet den Stream neu), wenn der Mindest-Durchsatz unterschritten wurde.

    Was SeppJ noch vorschlagen wollte, wenn hustbaer nicht schneller gewsen wäre, ist, dass dein Skript ja 10 Sekunden lang mit voller CPU Leistung die Daten erfasst. Das ist unnötig und verbraucht sinnlos CPU-Zeit. Um das einzuschränken solltest nach jeder Datenerfassung die CPU kurz abgeben (per Sleep oder so). Wenn du dir das im Task Manager anguckst solltest du einen 10 Sekunden Spike bemerken, wenn dein Skript läuft.


  • Mod

    @DocShoe sagte in Upload Traffic überwachen > wenn zu gering > batch ausführen:

    Was SeppJ meint ist, dass dein Skript ja 10 Sekunden lang mit voller CPU Leistung die Daten erfasst. Das ist unnötig und verbraucht sinnlos CPU-Zeit. Um das einzuschränken solltest nach jeder Datenerfassung die CPU kurz abgeben (per Sleep oder so). Wenn du dir das im Task Manager anguckst solltest du einen 10 Sekunden Spike bemerken, wenn dein Skript läuft.

    Das hätte ich zwar auch eingewendet, aber hier war hustbaer schneller.



  • @DocShoe
    Danke für die Erklärung. Dann hab ich jetzt meinen eigenen Wachhund 😃 Danke.
    Tatsächlich habe ich keinen nennenswerten CPU-Ausschlag bei der 10-sekündigen Ausführung der Batch-Datei.

    Das einzige woran ich jetzt gerade noch rumprobiere ist, dass die Datei nicht ausgeführt wird wenn der Befehl taskkill OBS nicht findet, weil es bereits komplett beendet/abgestüzt war. Aber das finde ich 😉 EDIT: habs...



  • Auf die schnelle zusammengegoogelt:

    $obs = Get-Process obs64.exe -ErrorAction SilentlyContinue
    if ($obs) 
    {
       // Prozess lebt noch
       taskkill /f /im obs64.exe
    }
    


  • Dann hab ich jetzt genau was ich wollte 😃
    Vielen Dank nochmal an alle Mithelfenden 😊
    Die Deutsche Krebsforschung wirds freuen - auch wenns ein Tropfen auf den heißen Stein ist...

    Ein kleine unabhängige Frage hätte ich vielleicht noch...
    Die Batch Datei wird ja jetzt vom Taskplaner aller 5 Minuten ausgeführt. Wenn der Stream jetzt also durch den Watchdog neugestartet wird, dann passiert das nur im Hintergrund als Prozess. Es gibt kein OBS- Fenster.
    Ich weiß dass die Option "Unabhängig von der Benutzeranmeldung ausführen" dafür verantwortlich ist.
    Ich kann aber das Häkchen nicht bei "Nur ausführen, wenn der Benutzer angemeldet ist" setzen, weil, dadurch dass ich über Remote Desktop auf den Streaming PC zugreife, der sich beim Beenden des Zugriffs automatisch abmeldet und der Prozess dann einfach gar nicht aufgeführt würde.
    Lässt sich das verborgene OBS irgendwie wieder in den Vordergrund heben?



  • @DocShoe
    Hatte schon was gefunden was funktiont hat.
    Hab einfach als erste Zeile geschrieben:
    $ErrorActionPreference = "Continue"
    Damit gings direkt schon



  • Du könntest versuchen, den Prozess mit Credentials zu starten, das scheint aber etwas Fummelarbeit zu sein.
    Auf Stack Overflow habe ich das hier gefunden, vllt kannste was damit anfangen.

    Edit:
    Käse, bei der Abmeldung wird dann auch der Prozess beendet.

    Das Problem ist, dass es für jeden Benutzer einen virtuellen Desktop gibt, auf dem die Fenster angezeigt werden, die der jeweilige Benutzer erzeugt hat (also eigentlich die Anwendungen, die mit seinem Benutzerprofil gestartet wurden). Da dein Skript ohne Benutzeranmeldung läuft bekommt es einen System-Desktop, auf den du als anderer Benutzer keinen Zugriff hast.



  • @DocShoe
    Ganz unten in deinem Link könnte vielleicht eine Lösung sein?
    Dort steht, dass Dienste mit eingetragenen Benutzeranmeldeinformationen ausgeführt werden können. Nun ist OBS aber kein Dienst, sondern ein Prozess. Lässt sich ein Prozess vielleicht in einen dafür kreierten Dienst packen?
    Könnte das klappen?


Anmelden zum Antworten