Imenser lokaler Netzwerktraffic durch die IPC zwischen Steam & TpF2

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Hallo,


    ich habe festgestellt, dass während Tpf2 läuft bei mir ~50GiB Netzwerktraffic die Stunde durch das loopback interface gehen. Hauptmenü oder Spielstand machen keinen Unterschied. Da Steam darüber IPC macht, bin ich mir ziemlich sicher, dass es IPC zwischen Steam & Tpf2 ist. Warum das bei TpF2 so Berserker geht und bei anderen Linux-nativen spielen nicht, kann ich allerdings nicht erklären. Da aber ständig TCP-Verbindungen geöffnet & wieder geschlossen werden (siehe tcpdump & perf report screnshot), gehe ich davon aus, dass es ein Bug ist. Habe Tpf2 nochmal auf einem anderen Gerät ohne Mods oder irgendwelche Sondereinstellungen installiert, selbes Problem. Hoher Traffic nur im Hauptmenü, nicht im geladenen Spiel & um den soll es hier erstmal nicht gehen.


    Ist das Problem bekannt bzw. falls ihr auf Linux via Steam spielt, könntet ihr bitte überprüfen ob dies bei euch auch so ist? Einfach mit b(py)top schauen ob der Netzwerktraffic auf dem lo Netzwerkinterface nach dem Spielstart massiv nach oben schießt.



    Unten links im Screenshot kann der Netzwerktraffic gesehen werden.


    tcpdump von lo interface (20s Tpf2 und schon so viel Pakete, dass das Logfile zstd komprimiet zu groß für hier ist, entpackt sinds 270MiB)


    Übersicht vom perf tool:

    Reingezoomt auf syscalls beim obersten call:

    Grüße

    Oskar

  • Im Hauptmenü oder im Spiel?


    Es könnte intern die Nachfrage bei File IO sein, sprich Mapping zwischen dem virtuellen Filesystem und dann zu einem bestimmten Steam Mod. (Workshop ID zum Verzeichnis Nachfrage)


    Dann gäbe es noch die Steam Achievements...

    Meine Mini Testmap mit CommonAPI2 zeigt da so 179KiB/s da gerade an.


    Wird es denn weniger wenn du ein Spielstand ohne Workshop Mods startest?

  • Sowohl im Hauptmenü als auch weiterhin während des Spielens, hab den Beitrag entsprechend editiert.

    Auf dem 2. Gerät, von welchem tcpdump & der Screenshot sind, ist kein einziger Mod abboniert, alles rausgefiltert. Verhalten genau gleich zu meinem Desktop mit vielen Mods.

    Steam Offline-Modus ändert auch nix.

  • Ja im Hauptmenü hab ich so 37MiB/s, im Spiel viel weniger.


    Ich hab mal mir den Spaß gemacht und den call zu UI::CGameUI::CheckAchievements via debugger raus genommen, das hat nix geändert.


    Alternativ könnte es auch noch modio Kram sein...

  • Danke für deine beiden Tests.

    Hat mod.io irgendeinen extra Prozess mit dem Tpf2 IPC machen könnte? Ist ja kein Netzwerktraffic nach "draußen" über eth*, sondern nur lokal auf lo.

  • Mir fällt da gerade nichts ein. Das müsste alles im selben Process laufen und daher kein lo traffic machen.

    Das SteamOverlay hab ich bei mir abgeschaltet, kann also auch eigentlich nicht der Steam Browser sein.

  • Steam overlay habe ich auch abgeschaltet, ich hab auch mal veruscht LD_PRELOAD zu überschreiben, sodass gameoverlayrender.so überhaupt nicht reingeladen wird. Hilft beides nix. Hatte vergessen bei tcpdump mir den Inhalt der Pakete anzuschauen, bei einigen kommt im kodierten Binärmatch immer wieder Pfade zu workshopmods vor. Werde gleich mal probieren statt die Workshop mods nur zu deaktivieren, wirklich alle zu deabbonieren.

  • Warum lange suchen ? Zieh doch einfach mal für 5 Min den LAN-Kabel oder deaktiviere das W-Lan

    Alle Apps und Co die dann rumschreien: "... ich hab und brauche eine I-Netverbindung" sind dann die Übeltäter 😉

  • Das kann ja nur an steam liegen.

    Ich nutze TPF2 nicht über steam und habe daher auch NULL traffic. Da ich modio innerhalb TPF nicht nutze, kommt daher auch nichts.

    Ich finde das schon arg bedenklich was da so an traffic statt findet. Das Spiel selbst benötigt ihn ja offensichtlich nicht.

    TPF2 selbst versucht nichtmal eine Verbindung aufzubauen.

    Ryzen 5700X3D, RX 9070, 32 GB RAM

  • Ihr versteht schon, das LO Interface der Loopback Adapter ist um TCP Verbindungen zwischen Userprozesse zu ermöglichen.


    Naja, ein dump wäre nur aussagekräftig während des Spiels.
    Während man im Hauptmenü ist, lädt TPF2 ja ggf. noch Mods per Workshop herunter, der Traffic wäre also normal. Auch das an der Stelle TPF2 nach dem Mapping zwischen IDs und Dateipfade macht.

    (Das macht CommonAPI2 ja auch sobald ne neue Liste von Mods irgendwie aktiv ist)


    Bei einer Mod wird halt an verschiedenen stellen, auch in der CommonAPI2 schlussendlich eine Funktion aufgerufen, die aus der Workshop ID dann den Pfad erstellt. Das macht im Endeffekt dann die Steam API schlussendlich.

    Ich könnte da wohl via CommonAPI2 einen Cache einbauen, keine Ahnung ob das sinnvoll ist. Aber was ich nicht verstehe, warum es keine Änderung zwischen einen Savegame mit Mods und ohne Steam Mods gibt.


    Unter Einstellungen mal den Debug Modus von UG abstellen, speichern und Spiel komplett neu starten. (wichtig! und dann den traffic anschauen.)


    Die UG LUA Console hat auch ne Funktion die irgendwie ne Modliste nutzt, ggf. gibt es dort Probleme,

  • Vor dem Deabbonieren aller bereits deaktivierten (2. Gerät) Workshop-Mods ist mir aufgefallen, dass ich auf dem 2. System mir nur den Traffic während das Hauptmenü läuft angeguckt habe. Sobald das eigentliche Spiel läuft habe ich die gleichen Werte wie eis_os. Ich kann es also nicht reproduzieren. Das ist mir leider durchgerutscht. Entschuldigung für die Verwirrung.


    Wird ein Spielstand ohne irgendwelche Mods geladen, dann sind im Spiel nur noch konstant 50 Mib/s, während es ja wohl eher <1Mib/s sein sollte. Als ich dann in Steam alle Workshop-Mods deaktiviert hatte, hatte ich mit dem Modlosen Spielstand nur noch 200-700 Kib/s traffic. Debug Modus an/aus hat nix gebracht.

    Wenn ich mehr Zeit & Geduld habe, werde ich mal tcpdumps mit Inhalt der TCP-Pakete von Hauptmenü, dem 200 Kib/s & dem 50 Mib/s szenario mit nem fuzz diff Skript, dass ich mir mal geschrieben hatte, vergleichen. Eventuell sind da aufschlussreiche Muster drin.

    Einmal editiert, zuletzt von eis_os () aus folgendem Grund: Ein Beitrag von bionade24 mit diesem Beitrag zusammengefügt.

  • Also ich hab mal ein pcap (nur während des Spiels) in Wireshark geladen, das sieht mir während des Spiels nach einer Workshopliste aus. Zumindest das große Datenpaket.


    Die ModRep hat ne std::list<std::pair<int, std::string>> m_workshopId2path; Liste, also daher sollte es nicht kommen.


    Spaßeshalber hab ich - da ich Puzzle liebe - mal ein commonapi._native.dampf.getMods() gemacht,

    und finde so auch die Daten TCP Steam wieder, wie Timestamp oder sizeOnDisk

    Code
      {
        folder = "/ZEUGS/Games/Steam/steamapps/workshop/content/1066780/1957631242",
        handle = 1957631242,
        sizeOnDisk = 9996549,
        timestamp = 1676107902,
      },


    Sprich es gibt vom Anschein nach zumindest bei mir hier ein regen Datenaustausch zwischen Steam Ciient und Steam API im Spiel.

    Ob das durch UG verursacht hat, keine Ahnung.


    Wireshark:

    () = WorkshopID (bzw. Handle)
    {} = sizeOnDisk

    [] = timeStamp





    -edit-


    Bin mir nun ziemlich sicher woran es liegt. Es liegt an dem neuen ModHub von UG.

    Keine Ahnung was UG sich dabei gedacht hat... da gibt es halt einen Thread der ständig die Steam IPC nutzt um die ModHub Daten zu füttern.

    Nur der Thread läuft auch während eines Spiels.


    Urban Games macht halt Urban Games Sachen... ||

  • Keine Ahnung ob sie einen Bugreport haben wollen, manche Nutzer hatten einen Erfolg.


    Ich hab mir das mal näher angeschaut und UGs Code funktioniert so:


    disableSleep = 1 im Hauptmenü und wird im Spiel 0, d.h. UG bremst den thread per nanosleep aus.
    Wenn ich da bei Sekunden ne 2 ms machen, mein 8600G ist mit den par Kb unterfordert so das man nix im Spiel merkt...


    Ob das daher Spiel relevant ist, keine Ahnung. Es könnte sein, wenn man viele Mods im Abo hat, das sich das dann doch summiert.

    Wer Linux und CommonAPI2 nutzt und alle 200ms ein Frame Einbrauch verzeichnet, dem könnte ich ggf testweise einen Patch dafür schreiben, das im Spiel nur noch nanosleep ausgeführt wird.


    Alternativ Versuchsweise, dieses im Speicher / TransportFever

    48 C7 45 D0 00 00 00 00 48 C7 45 D8 00 C2 EB 0B

    durch dieses hier ersetzen:


    48 C7 45 D0 14 00 00 00 48 C7 45 D8 00 C2 EB 0B

    Das würde dann nanosleep 20ms warten lassen..


    -edit-

    PS: Das passiert natürlich nur mit der Steam Version. Wie viele Mods Ihr im Spielstand aktiviert habt ist unerheblich. Die Anzahl der im Workshop abonnierten Mods ist ausschlaggebend. Sprich auch eine leere Map ohne Mods. (Wie am Anfang, hat man dann halt ~8MB/s zusätzlichen Traffic intern. (Also Loopback zurm Steamclient, nicht nach außen)

  • Sieht mir aber ganz stark nach einem Busy-Waiting im Spiel zur Synchronisation mit dem Steam-Backend aus. Könnte auch wieder unangenehme Racing-Condition verursachen sofern man es ändert. Ist also mit ziemlicher Vorsicht zu verwenden.

  • Da ich meinen eigenen Dampf Client API geschrieben habe, hab ich gute Chancen das ich das nicht schlimmer mache als es gerade ist und ich weiß was ich tue ;)


    Der ModHub ist das neue Teil Ingame ModBrowser. Ich kann mir auch denken warum UG das so gemacht hat, um oben Links eine % Anzeige darzustellen.

    Laut SteamSDK Beschreibung kann man sonst nur auf eine Status Änderung via callback reagieren.
    Das wäre https://partner.steamgames.com…ISteamUGC#ItemInstalled_t


    Ich kann gefahrlos modhub::SteamModHubBackend::Init::lambda_fn(mdata); aus dem Spiel entfernen, bzw. das Interval ändern.
    Man bekommt halt kein Feedback bzw. erst wenn man im Menü wieder ist oder nur alle X ms. Wie ich schon oben ausgeführt habe, hat das keine ModRep Verbindung,


    Quasi macht die lambda Funktion nichts anderes als ständig die Steam API nach der Liste:

    • Mutex
    • ISteamUGC->GetNumSubscribedItems()
    • Vector allozieren für die IDs
    • ISteamUGC->GetSubscribedItems()
    • Mutex
    • SteamModHubBackend->flathashmap reallozieren
    • Für alle IDs dann:
      • ISteamUGC->GetItemState()
      • ISteamUGC->GetItemInstallInfo() ggf. Progress?
      • Alle die Daten in eine flathashmap schreiben


    D.h. es muss dann nach jedem Durchlauf mindestens 8 Bytes * ModIds für die Ids alloziert werden im Thread

    Via TCP müssen mindestens jeweils ein Datenpaket zum SteamClient gesendet werden, und die Daten dann abgeholt werden.


    Bei 2000 Mods hast dann schon mal 2002 Roundtrips zum Kernel, lecker.. Ach und GetItemInstallInfo holt auch den Pfad ab, wenn wir den bei 512Bytes einstellen, haben wir dann alle 200 ms 1MB durch den Kernel gejagt für nicht Spielrelevantes.






    Außerdem, gibt es für alle solche Sachen einen Schalter in CommonAPI2, man muss den Fix nicht aktivieren, wenn man nicht möchte.

  • Alternativ Versuchsweise, dieses im Speicher / TransportFever

    48 C7 45 D0 00 00 00 00 48 C7 45 D8 00 C2 EB 0B

    durch dieses hier ersetzen:


    48 C7 45 D0 14 00 00 00 48 C7 45 D8 00 C2 EB 0B

    Das würde dann nanosleep 20ms warten lassen..

    Ich kann den hexstring weder im Tpf2 binary, den mitgelieferten libs noch dem gedumpten Prozess finden.

    Habs mit hexer & mit grep -obUaP '\x48\xC7\x45\xD0\x00\x00\x00\x00\x48\xC7\x45\xD8\x00\xC2\xEB\x0B' * versucht.

  • Steam Build 35924 Linux.Build, hier via edb: TransportFever2


    Auch per Hex Editor auffindbar, Okteta mag nur keine Abstände:

    48C745D00000000048C745D800C2EB0B


    Keine Ahnung... das Fragment ist auch so in Build 35915 vorhanden...

  • bionade24

    Hat das Label Bug behoben hinzugefügt