Paper & Purpur Server-Optimierung: Tick-Loop-Analyse und TPS-Stabilisierung
Praxisorientierter Deep-Dive in die Konfiguration von Paper und Purpur: Spark-Profiler, Entitäts-Aktivierungsradien, Chunk-Generierung und 20-TPS-Sicherung.
Paper & Purpur Server-Optimierung: Tick-Loop-Analyse und TPS-Stabilisierung
Minecraft-Server stoßen bei steigenden Spielerzahlen unweigerlich an Grenzen, wenn die Serversoftware in der Standardkonfiguration belassen wird. Ein einzelner Spiel-Tick verfügt über ein Zeitbudget von exakt 50 Millisekunden. Überschreiten die Berechnungen für Entitäten, Block-Ticks und Chunk-I/O diese Zeitspanne, verringert sich die Tickrate (TPS) von idealen 20,0 auf Werte darunter. Die Folge sind desynchronisierte Trefferabfragen, verlangsamte Redstone-Schaltungen und Teleport-Rücksetzer.
Dieser Leitfaden führt Sie durch eine datengestützte Optimierungsstrategie für Paper und Purpur unter Minecraft 1.20 und 1.21.
1. Systematische Ursachenforschung mit Spark
Bevor Parameter verändert werden, muss Klarheit über die tatsächlichen Rechenzeitfresser herrschen. Das Werkzeug der Wahl ist der Spark-Profiler. Ein fünfminütiger Profiling-Lauf während hoher Spielerlast liefert ein statistisch belastbares CPU-Sampling:
/spark sampler --timeout 300
Der ausgegebene Web-Link führt zu einem interaktiven Call-Tree. Achten Sie auf folgende Indikatoren:
MinecraftServer#tickServer: Sollte mindestens 80 % der Gesamtlaufzeit ausmachen.ServerLevel#tick: Zeigt den Anteil einzelner Welten.Entity#tick: Wenn Entitäten mehr als 35 % der Tickzeit beanspruchen, müssen Entitäts-Limits und Aktivierungsradien angepasst werden.ChunkMap#tick/ Chunk-Loading: Beansprucht das Laden von Chunks mehr als 15 %, liegt das Problem an Churn-Bewegungen unvorbereiteter Welten.
2. Entkopplung von Sicht- und Simulationsweite
Seit Minecraft 1.18 trennt die Server-Engine die visuelle Renderdistanz von der tatsächlichen Simulationsdistanz. Dies ist der wirkungsvollste Hebel zur Schonung des Haupt-Threads:
# server.properties
view-distance=10
simulation-distance=5
Bei einer Simulationsdistanz von 5 Chunks berechnet der Server lediglich einen Radius von 5 Chunks um jeden Spieler (eine Fläche von 11x11 = 121 Chunks pro Einzelspieler). Die visuelle Distanz von 10 Chunks wird asynchron vom No-Tick-System an den Client gestreamt, ohne dass dort Berechnungen für KI, Mobs oder Flüssigkeiten anfallen. Gegenüber einer veralteten kombinierten Distanz von 10 Chunks (21x21 = 441 Chunks) sinkt die CPU-Belastung um mehr als 65 %.
3. Feinabstimmung der Entity-Activation-Range in paper-world-defaults.yml
Die Entitäts-Aktivierungsreichweite legt fest, in welcher Distanz zum Spieler Mobs vollwertige Verhaltens-Ticks ausführen. Befinden sich Tiere oder Monster außerhalb dieses Radius, pausieren ihre Pfadfindungsalgorithmen:
# config/paper-world-defaults.yml
entities:
activation-range:
animals: 16
monsters: 24
raiders: 32
misc: 8
water: 8
villagers: 16
flying-monsters: 32
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
villagers-max-per-tick: 4
villagers-every: 600
villagers-for: 100
tick-inactive-villagers: false
ignore-spectators: true
Kritische Schalter
tick-inactive-villagers: false: Verhindert, dass Dorfbewohner in Farmen oder Handelshallen dauerhaft CPU-Zyklen beanspruchen, wenn kein Spieler in deren unmittelbarer Interaktionszone steht.wake-up-inactive: Lässt inaktive Mobs in kontrollierten Intervallen kurz erwachen, um Nahrungsaufnahmen oder despawn-Relevanz zu prüfen, statt sie unkontrolliert zu belasten.
4. Purpur-Spezifische Hebel für Hochlast-Server
Purpur baut auf Paper auf und stellt zusätzliche Performance-Flags bereit, die in vanilla-kompatibler Weise extreme Spitzen glätten:
# config/purpur.yml
settings:
use-alternate-keepalive: true
world-settings:
default:
gameplay-mechanics:
entities:
villager:
lobotomize:
enabled: true
check-interval: 60
zombie:
aggressive-towards-villager-when-lagging: false
mobs:
villager:
brain-ticks: 2
iron_golem:
can-swim: false
villager.lobotomize.enabled: true: Wenn ein Dorfbewohner in einem 1x1-Block gefangen ist (typisch für Trading-Hallen), wird seine Pfadfindungs-KI vollständig eingefroren. Er handelt weiterhin normal, verbraucht jedoch null Millisekunden Pfadfindungszeit.use-alternate-keepalive: true: Sendet KeepAlive-Pakete im Ping-Pong-Verfahren über Netty. Dadurch fliegen Spieler bei kurzen Tick-Verzögerungen nicht mit Timeout-Meldungen vom Server.
5. Chunk-Vorabgenerierung mit Chunky
Das dynamische Erzeugen neuer Chunks durch den World-Generator (Terrain, Biome, Höhlen, Features) ist die rechenintensivste Operation in Minecraft. Tritt dies während des Spielbetriebs auf, bricht die TPS-Rate ein.
Die Lösung ist eine vollständige Vorabgenerierung aller Welten vor dem offiziellen Serverstart:
- Weltgrenze definieren (z. B. Radius 5.000 Blöcke):
/worldborder set 10000 - Chunky-Auftrag starten:
/chunky world world /chunky shape circle /chunky radius 5000 /chunky start
Durch die Vorabgenerierung liegen alle Chunks unkomprimiert im Region-Format (r.x.z.mca) vor. Der Server muss beim Erkunden lediglich sequenziell von der NVMe-SSD lesen, anstatt komplexe Simplex-Noise-Algorithmen zu berechnen.
6. Trichter- und Redstone-Optimierung in paper-world-defaults.yml
Große Sortieranlagen und automatisierte Farmen erzeugen durch permanente Block-Updates und Inventar-Überprüfungen erhebliche CPU-Last. Ein Trichter ohne Item-Transfer prüft standardmäßig jeden Tick (alle 50 Millisekunden), ob oberhalb aufsammelbare Items liegen oder Ziel-Container frei sind.
Passen Sie die Trichter-Parameter in paper-world-defaults.yml gezielt an:
# config/paper-world-defaults.yml
hopper:
cooldown-when-full: true
disable-move-event: true
ignore-occluding-blocks: true
cooldown-when-full: true: Versetzt volle Trichter in einen Ruhemodus, anstatt jeden Tick vergebens Transfer-Versuche auszuführen.disable-move-event: true: Unterdrückt das Feuern desInventoryMoveItemEvent, wenn keine Plugins (wie ChestShop) auf Trichter-Transfers lauschen müssen. Dies spart pro Transfer mehrere Methodenaufrufe im Event-Bus.ignore-occluding-blocks: true: Trichter prüfen nicht mehr nach oben durch solide Blöcke, ob ein aufsammelbares Item existiert, was unnötige Bounding-Box-Kollisionstests eliminiert.
Mit dieser abgestimmten Konfiguration bleibt die Tick-Dauer (MSPT) selbst bei 80 gleichzeitigen Spielern stabil unter 35 Millisekunden.
Häufig gestellte Fragen (FAQ)
Was ist der Unterschied zwischen view-distance und simulation-distance?
Die view-distance steuert, wie viele Chunks an den Client zur visuellen Darstellung gesendet werden. Die simulation-distance definiert den kleineren Radius, in dem Entities getickt, Pflanzen wachsen und Redstone schaltet.
Warum sinkt die TPS-Rate bei Villager-Trading-Hallen dramatisch ab?
Villager berechnen fortlaufend komplexe Pfadfindungs- und Arbeitsstations-Suchen (Brain-AI). Durch Deaktivierung des Tickens inaktiver Villager in purpur.yml lässt sich die CPU-Last um bis zu 80 % senken.
Wie verhindert man Lags durch ungenerierte Chunks bei der Welterkundung?
Mit Plugins wie Chunky werden alle Chunks innerhalb einer definierten Weltgrenze vor dem Serverstart vorberechnet und auf die SSD geschrieben.