Lag auf dem Minecraft-Server: Ursachen und Loesungen

Lag auf dem Minecraft-Server: Ursachen und Loesungen

Spieler beschweren sich ueber Lag. Bloecke brechen mit Verzoegerung, Mobs teleportieren herum, Items werden nicht aufgehoben. Sie pruefen die Konsole und alles scheint in Ordnung - Speicher nicht voll, CPU nicht bei 100%. Aber der Lag ist da. Was passiert hier?

Wenn Sie ein Minecraft-Server-Admin sind und herausfinden wollen, warum Ihr Server ruckelt, ist dieser Artikel fuer Sie. Kein Gerede, keine allgemeinen Ratschlaege. Konkrete Ursachen, konkrete Tools, konkrete Configs.

Was ist TPS und warum es die wichtigste Metrik ist

TPS steht fuer Ticks Per Second. Ein Minecraft-Server laeuft in einer Schleife: Jeden Tick verarbeitet er alles, was in der Welt passiert. Mob-Bewegung, Pflanzenwachstum, Redstone-Updates, Spieler-Paketverarbeitung. Idealerweise passieren 20 Ticks pro Sekunde. Ein Tick = 50 Millisekunden.

  • 20 TPS - alles in Ordnung, Server kommt mit
  • 18-19 TPS - minimaler Einbruch, Spieler merken es kaum
  • 15-17 TPS - spuerbar, Mobs bewegen sich ruckartig
  • 10-14 TPS - ernsthafter Lag, Gameplay wird unangenehm
  • Unter 10 TPS - Server ist kaum am Leben

Aktuellen TPS pruefen mit /tps (Spigot/Paper) oder ueber spark.

Wichtig: TPS kann nicht ueber 20 steigen. Wenn Sie 20.0 TPS haben, heisst das nicht, dass der Server im Leerlauf ist. Es bedeutet, dass er einen Tick innerhalb von 50 ms abarbeitet. Um die tatsaechliche Last zu verstehen, schauen Sie auf MSPT - Millisekunden pro Tick.

/spark tps
/spark health

MSPT von 30 ms bei 20 TPS bedeutet, Sie haben 20 ms Spielraum. MSPT von 48 ms - immer noch 20 TPS, aber Sie sind am Limit. Etwas mehr Last und TPS faellt.

Spark: Ihr wichtigstes Diagnose-Tool

Vergessen Sie das eingebaute Timings in Paper. Es ist veraltet und liefert weniger Informationen. Installieren Sie spark - ein Profiler, der genau zeigt, was Ressourcen frisst.

Installation

Laden Sie die jar von spark.lucko.me herunter und legen Sie sie in den plugins/-Ordner. Server neustarten.

Grundlegende Verwendung

/spark profiler start     -- Profil-Aufzeichnung starten

Warten Sie 2-5 Minuten, waehrend der Server unter normaler Last laeuft. Dann:

/spark profiler stop      -- Stoppen und Link erhalten

Spark gibt Ihnen einen Link zu einem Bericht. Oeffnen Sie ihn im Browser. Sie sehen einen Aufrufbaum - welche Funktionen wie viel Zeit brauchen. Suchen Sie die schwersten Aeste.

Worauf Sie achten sollten

  • Entity tick - Entitaetsverarbeitung. Wenn dies ueber 30-40% der Zeit einnimmt, haben Sie zu viele Mobs oder ein schlecht optimiertes Plugin
  • Chunk loading/generation - Chunk-Generierung und -Laden. Wenn dies Platz eins im Profil ist, generieren Sie Ihre Welt vor
  • Plugin-Handler - spark zeigt konkrete Plugins und deren Event-Handler. Oft kann ein schlecht geschriebenes Plugin den gesamten Server lahmlegen
  • Scheduled tasks - synchrone Aufgaben blockieren den Haupt-Tick

Ursache 1: Zu viele Entitaeten

Dies ist die haeufigste Ursache fuer Lag. Entitaeten umfassen Mobs, gedropte Items, Pfeile, Rahmen, Loren, Ruestungsstaender. Jede Entitaet wird jeden Tick verarbeitet.

1000 Kuehe in einem Gehege? Herzlichen Glueckwunsch, Sie haben eine Lag-Maschine gebaut.

Diagnose

/spark tickmonitor

Oder pruefen Sie ueber:

/minecraft:debug entities

Loesung

In paper-world-defaults.yml (Paper 1.19+):

entities:
  spawning:
    monster-spawn-range: 6          # Standard 8
    creative-arrow-despawn-rate: 60
    non-player-arrow-despawn-rate: 60

In spigot.yml:

entity-activation-range:
  animals: 16          # Standard 32
  monsters: 24         # Standard 32
  raiders: 48
  misc: 8              # Standard 16
  water: 8             # Standard 16
  villagers: 16        # Standard 32
  flying-monsters: 32  # Standard 32
  tick-inactive-villagers: false
  wake-up-inactive:
    animals-max-per-tick: 4
    animals-every: 1200
    animals-for: 100
    monsters-max-per-tick: 8
    monsters-every: 400
    monsters-for: 100

Die Entity Activation Range bestimmt, wie weit von einem Spieler entfernt Entitaeten einen vollen Tick erhalten. Ausserhalb dieses Radius werden sie seltener geticktet - enorme Einsparungen.

Item-Drops

Auf dem Boden liegende Items sind ebenfalls Entitaeten. Konfigurieren Sie den Despawn:

# spigot.yml
item-despawn-rate: 3000   # Standard 6000 (5 Minuten), setzen auf 2.5 Minuten

Installieren Sie ClearLagg oder schreiben Sie ein einfaches Skript, das Drops alle 5 Minuten bereinigt. Warnen Sie Spieler 30 Sekunden vorher.

Ursache 2: Chunk-Loading und Generierung

Wenn sich ein Spieler bewegt, muss der Server neue Chunks laden. Wenn Chunks noch nicht generiert wurden, muessen sie erstellt werden. Chunk-Generierung ist eine der schwersten Operationen.

Welt vorgenerieren

Verwenden Sie Chunky zur Vorgenerierung:

/chunky radius 5000
/chunky start

Lassen Sie es ueber Nacht laufen. Die Vorgenerierung eines 5000-Block-Radius vom Spawn dauert mehrere Stunden, aber danach loesen neue Spieler keine Generierung mehr aus.

view-distance und simulation-distance

Dies sind Ihre maechtigsten Optimierungshebel. In server.properties:

view-distance=7
simulation-distance=4

view-distance - wie viele Chunks um einen Spieler an den Client gesendet werden. Standard ist 10, aber 7-8 reicht fuer die meisten Server voellig aus.

simulation-distance - wie viele Chunks um einen Spieler tatsaechlich geticktet werden (Mobs bewegen sich, Redstone funktioniert, Pflanzen wachsen). Dies ist die kritische Einstellung. Eine Reduzierung von 10 auf 4-5 senkt die Last drastisch.

Wichtig: simulation-distance muss kleiner oder gleich view-distance sein. Spieler sehen die Chunks, aber in entfernten Chunks passiert nichts. Fuer die meisten Spieler ist das akzeptabel.

Ursache 3: Redstone

Automatisierte Redstone-Farmen sind der Schmerz jedes Servers. Ein einziger Endlos-Taktgeber kann die TPS des gesamten Servers in den Keller ziehen.

Paper-Limits

# paper-world-defaults.yml
redstone-implementation: ALTERNATE_CURRENT

ALTERNATE_CURRENT - eine alternative Redstone-Update-Implementierung, deutlich schneller als Vanilla. Einige sehr komplexe Konstruktionen koennten kaputtgehen, aber fuer 99% der Anwendungsfaelle ist es perfekt.

Hopper- und Kolben-Limits

# paper-world-defaults.yml
hopper:
  cooldown-when-full: true
  disable-move-event: false
  ignore-occluding-above: false

Hopper sind einer der teuersten Bloecke fuer die Performance. cooldown-when-full: true reduziert die Last durch volle Hopper erheblich.

Ursache 4: Plugins

Schlecht geschriebene Plugins sind die zweithaeufigste Lag-Ursache nach Entitaeten. Typische Probleme:

  • Synchrone Datenbankabfragen. Ein Plugin fuehrt eine SQL-Abfrage im Hauptthread aus, und waehrend es auf die Antwort wartet, steht der gesamte Server still. Das ist ein TPS-Killer. Verwenden Sie nur Plugins von vertrauenswuerdigen Entwicklern
  • Schwere Event-Handler. Ein Plugin auf PlayerMoveEvent, das jeden Tick komplexe Pruefungen fuer jeden Spieler durchfuehrt
  • Speicherlecks. Ein Plugin erstellt Objekte, raeumt sie aber nie auf. Mit der Zeit gerät der GC in Panik

Wie man das problematische Plugin findet

Spark zeigt dies direkt im Profil. Aber es geht auch einfacher - deaktivieren Sie Plugins einzeln (binaere Suche) und beobachten Sie die TPS.

Wenn Sie ein bestimmtes Plugin verdaechtigen:

/spark profiler start --only-ticks-over 50

Dies zeichnet ein Profil nur fuer Ticks auf, die laenger als 50 ms dauerten (also TPS-Einbrueche verursachten). Im Bericht sehen Sie genau, was laggt.

Ursache 5: Garbage Collection (GC)

Java verwendet einen Garbage Collector zur Speicherverwaltung. Wenn der GC laeuft, kann er den gesamten Server kurz anhalten. Wenn Sie 16 GB RAM zugewiesen haben und der GC schlecht konfiguriert ist, koennen Pausen 200-500 ms erreichen. Das sind 4-10 verlorene Ticks auf einmal.

Aikars Flags

Aikar (ein Paper-Entwickler) hat einen Satz JVM-Flags zusammengestellt, die fuer Minecraft optimiert sind. Verwenden Sie diese:

Fuer Server mit 12 GB RAM oder weniger:

java -Xms10G -Xmx10G -XX:+UseG1GC -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 \
  -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -jar server.jar --nogui

Wichtige Punkte:

  • -Xms und -Xmx sind gleich - das ist wichtig. Java verschwendet keine Zeit mit Heap-Groessenaenderungen
  • -XX:+UseG1GC - G1-Collector, optimal fuer Minecraft
  • -XX:MaxGCPauseMillis=200 - Ziel-GC-Pause nicht laenger als 200 ms
  • -XX:G1NewSizePercent=30 und G1MaxNewSizePercent=40 - Minecraft erstellt viele kurzlebige Objekte, daher ist die Young Generation vergroessert

Wie viel RAM zuweisen

Ein haeufiger Fehler ist zu viel RAM zuzuweisen. 32 GB fuer einen 50-Spieler-Server ist uebertrieben. Je groesser der Heap, desto laenger die GC-Pause.

Richtwerte:

  • Vanilla/Paper bis 20 Spieler: 4-6 GB
  • Paper 20-50 Spieler: 6-10 GB
  • Paper 50-100 Spieler mit Plugins: 10-14 GB
  • Forge mit Mods: abhaengig vom Modpack, aber starten Sie mit 8 GB

Paper und Purpur: Was man einstellen sollte

Wenn Sie noch auf Spigot sind - wechseln Sie zu Paper. Wenn Sie auf Paper sind - schauen Sie sich Purpur an. Jedes fuegt Optimierungen hinzu, die in Vanilla nicht vorhanden sind.

paper-global.yml

chunk-system:
  gen-parallelism: default
  io-threads: 4
  worker-threads: 4

async-chunks:
  threads: 4

paper-world-defaults.yml

entities:
  spawning:
    per-player-mob-spawns: true
    alt-item-despawn-rate:
      enabled: true
      items:
        cobblestone: 300
        netherrack: 300
        sand: 300
        gravel: 300
        dirt: 300
        short_grass: 300
        kelp: 300
        bamboo: 300

environment:
  treasure-maps:
    enabled: true
    find-already-discovered:
      loot-tables: true
      villager-trade: true
  optimize-explosions: true

tick-rates:
  mob-spawner: 2
  sensor:
    villager:
      secondarypoisensor: 80
  behavior:
    villager:
      validatenearbypoi: -1

per-player-mob-spawns: true - statt eines globalen Mob-Limits wird das Limit pro Spieler gezaehlt. Ein Spieler mit einer riesigen Farm verbraucht nicht das gesamte Mob-Budget des Servers.

alt-item-despawn-rate - Muell-Bloecke (Kopfsteinpflaster, Erde) verschwinden schneller. Spieler merken es nicht, aber es gibt weniger Entitaeten auf dem Server.

optimize-explosions: true - optimierter Explosionsalgorithmus. Immer aktivieren.

Zusaetzliche server.properties

network-compression-threshold=256
max-tick-time=-1

network-compression-threshold=256 - Pakete groesser als 256 Bytes komprimieren. Standard ist ebenfalls 256, aber stellen Sie sicher, dass der Wert gesetzt ist.

max-tick-time=-1 - deaktiviert den Watchdog, der den Server bei langen Ticks beendet. In der Produktion ist dies umstritten, aber es verhindert Notfall-Neustarts bei kurzen Lag-Spitzen.

Wenn Lag kein Lag ist - sondern ein Angriff

Manchmal haben Sie alles optimiert, TPS ist stabil bei 20, aber Spieler beschweren sich trotzdem ueber Lag. Oder umgekehrt - TPS faellt ploetzlich auf 5, obwohl sich nichts geaendert hat.

Mehrere Anzeichen, dass es kein normaler Lag ist:

  • Ploetzlicher TPS-Einbruch ohne sichtbare Ursache - niemand ist beigetreten, keine neuen Plugins, aber TPS ist eingebrochen
  • Netzwerk-Timeouts - Spieler koennen sich nicht verbinden oder werden mit "Timed out" gekickt
  • Hohe Netzwerklast bei normaler CPU-Auslastung
  • Massenhafte Verbindungsversuche - Dutzende oder Hunderte Verbindungsversuche pro Sekunde in den Logs

Dies koennte ein DDoS- oder Bot-Angriff sein. Ein Netzwerkangriff flutet die Leitung oder ueberlastet den Server mit gefaelschten Verbindungen, und es sieht aus wie Lag, obwohl Minecraft selbst normal laeuft.

Wenn Sie diese Symptome beobachten, helfen Configs nicht weiter. Sie brauchen Traffic-Filterung auf Netzwerkebene. Genau dafuer gibt es Dienste wie MineGuard - sie filtern den Traffic, bevor er Ihren Server erreicht, und schneiden unerwuenschte Verbindungen ab. Wenn Sie bereits angegriffen wurden oder sich praeventiv schuetzen wollen, lohnt es sich, solchen Schutz einzurichten.

Optimierungs-Checkliste

Fassen wir zusammen. Hier ist der Aktionsplan bei Lag:

  1. TPS und MSPT pruefen ueber /spark tps - Ausmass des Problems verstehen
  2. spark Profiler starten - herausfinden, was genau laggt
  3. Entitaeten-Anzahl pruefen - die haeufigste Ursache
  4. Entity Activation Range konfigurieren in spigot.yml
  5. simulation-distance senken auf 4-5
  6. Paper-Optimierungen aktivieren - optimize-explosions, per-player-mob-spawns, alt-item-despawn-rate
  7. ALTERNATE_CURRENT verwenden fuer Redstone
  8. Aikars Flags anwenden fuer die JVM
  9. Welt vorgenerieren mit Chunky
  10. Plugins pruefen ueber spark auf schwere Event-Handler

Wenn das Problem nach allen Optimierungen bestehen bleibt, pruefen Sie, ob Ihr Server angegriffen wird. Netzwerkprobleme lassen sich nicht mit Minecraft-Configs loesen.


Schützen Sie Ihren Server vor DDoS-Angriffen

Kostenloser Schutz mit 5-Minuten-Einrichtung. 1 TB Traffic inklusive.

Kostenlos testen


Weitere Artikel