Techtalk: 1vs1 Lags und die Änderungen der letzten Wochen

Dieses Thema im Forum "Ankündigungen" wurde erstellt von zortax, 20. August 2019.

  1. zortax

    zortax Dev SysAdmin

    Beiträge:
    6
    Zustimmungen:
    64
    Punkte für Erfolge:
    43
    Hallo Timolianer,

    sicher habt ihr germerkt, dass wir in den letzten paar Tagen einige Performance-Optimierungen auf den 1vs1 Servern durchgeführt haben. Letzendlich mussten wir dafür ja auch das ein oder andere Mal die Server tagsüber neustarten. Über die letzten Wochen habe die Lags ja leider wirklich Überhand genommen, das war uns als Team durchaus bewusst. Des öfteren habe ich Ingame Kommentare wie "Holt euch doch bessere Server!"
    oder "Mehr RAM für Timolia!" gelesen. Da das Ganze in der Realität (wie so oft) dann doch etwas komplizierter ist, möchte ich in diesem Beitrag einmal detaillierter erklären, warum Minecraft Server laggen, was bei uns die Ursachen
    waren und wie wir das ganze deutlich optimiert haben.
    Achtung: Das könnte ein bisschen technisch werden - vielleicht oder hoffentlich gerade deswegen interessiert es hoffentlich einige.

    Warum laggt also ein Minecraft Server?

    1. CPU Time

    In einem Computer Programm werden Anweisungen grundsätzlich nacheinander Abgearbeitet. Auch der Minecraft Server funktioniert so: 20 mal in der Sekunde wir die Hauptschleife des Servers, der sogenannte Tick, aufegrufen. Das ergibt im Normalfall eine Dauer von 50ms pro Tick. In einem Tick hat Minecraft viel zu tun: Es müssen die empfangenen Daten verarbeitet werden, Daten an die Spieler gesendet werden und diverse Berechnungen durchgeführt werden. Durch modifizierte Versionen des offiziellen Minecraft Server kann die Zeit, die die Minecraft benötigt, um alle diese Berechnungen durchzuführen, verkürzt werden.
    Alles in Allem benötigt ein gut optimierter Minecraft Server pro Tick etwa 2-3ms um die eigenen Berechnungen etc. durchzuführen (wobei der exakte Wert von verschiedenen Variablen, zum Beispiel der Spieleranzahl, abhängt). Den Großteil des Ticks macht Minecraft also gar nichts. Diese Zeit steht Plugins zur Verfügung, die eigene Berechnungen etc. durchführen wollen.

    [​IMG]

    Timolia hat einen Haufen eigener Plugins. Sie verwalten Spielerdaten, Spielerränge, testen auf Cheats und vieles mehr. Kurz: es gibt eine Menge mehr zu tun pro Tick. Insbesondere das 1vs1 Plugin benötigt viel CPU Zeit: Es muss ständig Arenen laden, was sehr aufwändig ist und zum Beispiel auch beinhaltet, Daten von der Festplatte zu lesen. Betrachten wir nun also einen Tick, in dem 1vs1 eine Arena laden muss. Das Laden der Arena dauert so lange, dass der gesamte Tick nicht in 50ms fertig ist. Dadurch muss Minecraft den nächsten Tick verzögern. Da im Tick aber auch die Minecraft-internen Berechnungen durchgeführt werden, zum Beispiel das Verarbeiten von Hits und Spielerbewegungen, führt dies dazu, dass es laggt.


    [​IMG]
    Wie also lässt sich das beheben?

    Sicher ist euch aufgefallen, dass neuerdings ein Ladebalken angezeigt wird, bevor man in die Arena teleportiert wird. Insbesondere bei großen Turnieren, wenn viele Arenen gleichzeitig geladen werden müssen, können die Ladezeiten auch mal ein wenig länger sein. Intern läuft folgendes ab: Anstatt die Arena komplett in einem Tick zu laden, wird sie nach und nach geladen. Der Zeit, die das Mapladen pro Tick verwenden darf, ist nach oben beschränkt, um sicherzustellen, dass Minecraft keine Ticks verzögern muss. Durch diesen Trick kann es dazu kommen, dass die Arenen mehrere Ticks zum Laden benötigen, insbesondere wenn viele Arenen gleichzeitig laden. Darum also die Ladeanimation.


    Leider ist das nun aber nicht der einzige Grund, warum Minecraft Server laggen.
    Also, weiter gehts...


    2. RAM Usage

    Programme benötigen zum Arbeiten diverse Daten. Zur Laufzeit des Programms werden diese im Arbeitsspeicher abgelegt, damit der Prozessor schnell darauf zugreifen kann. Leider ist der Arbeitsspeicher begrenzt. Darum muss das Programm sich darum kümmern, Daten, die es nicht mehr Benötigt wieder aus dem Arbeitsspeicher zu löschen. Minecraft ist mit der Programmiersprache Java
    programmiert. Java kann sich automatisch darum kümmern, nicht mehr benötigte Daten aus dem Arbeitsspeicher zu löschen. Verantwortlich dafür ist der sogenannte "Garbage Collector", kurz GC. Es liegt aber weiterhin beim Programm die nicht benötigten Daten auch nicht mehr zu referenzieren, damit der GC diese auch als "Müll" erkennt und löscht. Passiert dies nicht, so werden die Daten nicht gelöscht und der Arbeitsspeicher läuft voll. Man spricht hier von einem "Memory Leak". Ist die maximale Arbeitsspeicherauslastung erreicht, muss Java das Programm anhalten um ausführlich nach nicht mehr benötigten Daten zu suchen, im schlimmsten Fall crasht das Programm sogar.
    Das Problem ist also klar: wenn der Minecraft Server zu viel Arbeitsspeicher verbraucht, zum Beispiel durch einen Memory Leak, dann führt das irgendwann zu Lags, weil der Garbage Collector aufräumen muss. Memory Leaks finden ist nicht einfach. Wir haben dafür letzte Woche einen Profiler auf einigen 1vs1 Lobbies laufen lassen. Das ist ein Programm, mit dem man genau Beobachten kann, welche Daten wann in den Arbeitsspeicher geladen werden und wann diese wieder gelöscht werden. Leider verursacht der Profiler selbst auch ein paar Lags, darum haben einige Server in der letzten Woche noch so unerträglich gelaggt. War leider notwendig um das Problem zu finden.

    Also, wie sehen diese Profiler-Infos aus?


    [​IMG]

    Der rote Bereich ist der Teil des Arbeitsspeichers, der mit neuen Daten befüllt wird. Der blaue Teil beschreibt einen anderen Teil: hier werden Daten abgelegt, die schon länger im Arbeitsspeicher sind. Der blaue Bereich wird vom vom Garbage Collector seltener aufgeräumt, da es mehr Rechenaufwand ist hier für Ordnung zu sorgen. Schön zu erkenn ist, wie immer mehr Daten geladen werden, bis der GC durchläuft und einen großen Teil wieder löscht. Das sind die roten "Zacken" im Diagramm. Bei genauerer Betrachtung erkennt man den Memory Leak: Bei 1.25M ms Uptime springt die Ausnutzung hoch. Hier haben wir auf unserem Testserver eine Arena geladen. Kurz nach 1.3M ms läuft automatisch der Garbage Collector durch. Viele Daten werden gelöscht, die Arena wird in den blauen Bereich verschoben, da sie weiterhin benötigt wird. Diese steigt also leicht an. Kurz vor 1.55M ms entscheidet sich der Garbage Collector auch den blauen Bereich aufzuräumen. Gut zu sehen ist, dass die Auslastung zwar leicht runter geht, aber nicht das Niveau erreicht, welches vor dem Mapladen erkennbar war. Da die Mapdaten aber nach dem Kampf nicht mehr benötigt werden, ist die Sache klar: ein Großteil der Mapdaten wird geleaked.

    Genaueres werde ich euch an dieser Stelle ersparen, aber letztendlich hat sich gezeigt, dass für einen Großteil des Problems die Serversoftware selber verantwortlich war. Wir haben den Fehler behoben und nebenbei noch ein paar andere Sachen optimiert. Weil bunte Graphen toll sind hier also die Daten von
    pvp02, mit Fix, bei knapp 100 Spielern online:

    [​IMG]

    Das Nette ist, dass durch die vielen Optimierungen, die wir im Minecraft Server selber durchgeführt haben die Ausnutzung nach dem GC Durchlauf sogar niedriger ist, als die Ausnutzung ohne den Leak vor unseren Fixes.

    Neben diesen beiden Problematiken haben wir bei unseren Recherchen noch diverse andere Probleme gefunden und viele davon bereits behoben. Auf dem Plan stehen außerdem weitere Performanceoptimierungen sowohl in unseren Plugins, als auch im Minecraft Server selbst. Die schlimmsten Lags sollten aber erstmal behoben sein. Hoffentlich macht das Kämpfen auf Timolia nun also wieder Spaß und hoffentlich ist hiermit auch ein wenig klarer geworden, warum das mit den Lags kein einfaches Thema ist und warum die Fixes so lange benötigt haben. Man hat eben nicht immer Semesterferien ^^

    Viel Spaß also weiterhin in 1vs1!
     
    Zuletzt bearbeitet: 21. August 2019
    airgap, _xlinx_, Thomas5432 und 30 anderen gefällt das.
  2. Edgxxar

    Edgxxar Admin Expert

    Beiträge:
    11
    Zustimmungen:
    21
    Punkte für Erfolge:
    3
    Find ich geil!
     
    168x12, NameIsTaken, Txast und 4 anderen gefällt das.

Diese Seite empfehlen