Minecraft Server Scheduling & Task-Management: Plugin-Tasks optimieren und CPU-Last reduzieren
# Minecraft Server Scheduling & Task-Management: Plugin-Tasks optimieren und CPU-Last reduzieren
Jeder Minecraft-Server-Admin kennt die Frustration unerklärlicher Lag-Spikes — die TPS sinken, Spieler beschweren sich, aber der Profiler zeigt ein Dutzend Plugins, von denen jedes einen kleinen Teil der Performance frisst. In vielen Fällen ist der eigentliche Schuldige kein einzelnes Plugin, sondern wie und wann diese Plugins ihre Arbeit planen.
Das Bukkit-Scheduler-System zu verstehen und Task-Timing zu managen ist eine der am meisten unterschätzten Optimierungsfähigkeiten für Server-Admins. Lass uns das auseinandernehmen.
Wie der Bukkit Scheduler funktioniert
Jedes Plugin, das wiederholte Arbeit erledigen muss — Spielerbedingungen prüfen, Economy-Zinsen berechnen, Scoreboards aktualisieren, Daten speichern — nutzt den Bukkit Scheduler. Es gibt zwei Kerntypen von Tasks:
- Synchrone Tasks (
runTask,runTaskTimer,runTaskLater): Laufen auf dem Haupt-Server-Thread und verbrauchen direkt das Tick-Budget. - Asynchrone Tasks (
runTaskAsynchronously,runTaskTimerAsynchronously): Laufen auf separaten Threads, außerhalb der Haupt-Tick-Schleife.
Das Problem? Viele Plugins — besonders ältere oder schlecht gewartete — planen synchrone, wiederholte Tasks, die jeden einzelnen Tick (alle 50ms) oder alle paar Ticks laufen, auch wenn es nichts Sinnvolles zu tun gibt. Genug davon gestapelt und du hast eine versteckte Steuer auf jeden Tick deines Servers aufgebaut.
Die wahren Kosten von runTaskTimer-Missbrauch
Stell dir ein Plugin vor, das einen synchronen Task jeden 1 Tick (period: 1) ausführt, um zu prüfen, ob jeder Online-Spieler eine bestimmte Permission oder Metadata hat. Bei 50 Spielern online sind das 50 Prüfungen × 20 Mal pro Sekunde = 1.000 Operationen pro Sekunde auf dem Haupt-Thread.
Multipliziere das mit 10 Plugins, die Ähnliches tun. Du hast einen erheblichen Teil deines Tick-Budgets verbraucht, bevor der Server überhaupt Block-Updates, Mob-KI oder Spielerbewegungen verarbeitet.
Häufige Übeltäter:
- Scoreboard-Plugins, die jeden 1-2 Ticks aktualisieren
- Chat-Formatierungs-Plugins, die ständig alle Spieler durchlaufen
- Hologramm-Plugins, die Text jeden Tick aktualisieren
- Schlecht geschriebene Minigame-Plugins, die Spiellogik jeden Tick ausführen, unabhängig von der Spieleranzahl
Problematische Tasks identifizieren
Mit Spark
Der [Spark Profiler](https://spark.lucko.me/) ist dein bestes Werkzeug. Führe /spark profiler für 30-60 Sekunden während Spitzenlast aus, öffne den Report und schaue unter "Minecraft Scheduler" im Call-Tree. Du siehst individuelle Task-Einträge nach Plugin mit ihrer CPU-Zeit.
Achte auf Tasks, die:
- Extrem häufig im Profiler erscheinen
- Eine hohe Eigenzeit im Vergleich zu anderen Tasks haben
- Zu Plugins gehören, die du nicht als schwer einschätzen würdest
Mit Timings (Paper)
Auf Paper-Servern führe /timings report aus und öffne den HTML-Report. Navigiere zu den Abschnitten "Async Catchers" und "Scheduler". Timings zeigt dir Pro-Tick-Durchschnitte für jeden geplanten Task, was es leicht macht, Ausreißer zu erkennen.
Praktische Optimierungsstrategien
1. Task-Intervalle erhöhen wo möglich
Wenn du Kontrolle über die Plugin-Konfiguration hast, suche nach Einstellungen, die die Task-Häufigkeit steuern. Viele Plugins bieten das an:
# Beispiel: scoreboard-update-interval in einem Scoreboard-Plugin
scoreboard:
update-interval: 20 # Ticks — von 2 auf 20 ändern (einmal pro Sekunde)
Ein Scoreboard, das einmal pro Sekunde (alle 20 Ticks) aktualisiert, ist für Spieler nicht wahrnehmbar, reduziert aber die CPU-Nutzung um das 10-fache im Vergleich zu alle 2 Ticks.
2. Async Tasks für Nicht-Welt-Operationen bevorzugen
Frage immer: Muss dieser Task auf dem Haupt-Thread laufen?
Datenbankabfragen, HTTP-Anfragen, Datei-I/O und rein rechenintensive Arbeit sollten immer async sein. Nur Operationen, die mit der Bukkit-API interagieren (Blöcke modifizieren, Entitäten bewegen, Pakete senden), erfordern synchrone Ausführung.
// Schlecht: Blockierende Datenbankabfrage auf Haupt-Thread
Bukkit.getScheduler().runTaskTimer(plugin, () -> {
db.queryPlayerData(); // Das blockiert den Tick!
}, 0L, 20L);
// Gut: Async-Abfrage, sync Callback nur für Welt-Interaktion
Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, () -> {
PlayerData data = db.queryPlayerData();
Bukkit.getScheduler().runTask(plugin, () -> applyDataToPlayer(data));
}, 0L, 20L);
3. Event-getriebene Logik statt Polling
Eines der größten Scheduler-Anti-Patterns ist Polling — alle X Ticks prüfen, ob sich etwas geändert hat, obwohl man einfach auf ein Event hören könnte.
Statt alle 20 Ticks zu prüfen, ob ein Spieler eine Region betreten hat, höre auf PlayerMoveEvent und reagiere nur, wenn tatsächlich Bewegung stattfindet. Das eliminiert den Task vollständig.
4. Tasks mit einem einzigen Scheduler konsolidieren
Manche Server-Setups laufen mit Dutzenden von Plugins, jedes mit eigenen unabhängigen Task-Timern. Erwäge eine Task-Konsolidierungs-Strategie — ein einzelnes Plugin oder Skript, das mehrere leichte Prüfungen in einem Task erledigt, reduziert den Scheduler-Overhead von Dutzenden Task-Registrierungen auf eine.
5. Unnötige Plugin-Features deaktivieren
Viele All-in-One-Plugins wie EssentialsX, CMI oder ähnliche haben standardmäßig Features aktiviert, die Background-Tasks planen, die du möglicherweise nicht brauchst:
# essentials config.yml
# AFK-Check deaktivieren, wenn du ein separates AFK-Plugin verwendest
afk-list-name: ''
afk-command-disabled: true
# Auto-Heal deaktivieren wenn nicht benötigt
respawn-delay: 0
Prüfe jede Plugin-Konfiguration und deaktiviere Features, die du nicht nutzt — jedes könnte eigene Scheduler-Tasks anhängen.
Paper und Folia Scheduling-Verbesserungen
Paper hat erhebliche Verbesserungen daran vorgenommen, wie es internes Scheduling handhabt, einschließlich der Verlagerung vieler Vanilla-Tasks (wie Mob-Spawn-Verteilung) zu effizienteren Ausführungsmodellen. Deinen Paper-Server aktuell zu halten stellt sicher, dass du automatisch von diesen Optimierungen profitierst.
Folia geht noch weiter mit regionisiertem Multithreading, bei dem verschiedene Weltregionen Tasks gleichzeitig auf separaten Threads verarbeiten können. Für große Server mit geografisch verteilten Spielern ist Folias regionbasierter Scheduler (RegionScheduler, EntityScheduler) ein Game Changer — obwohl Plugin-Kompatibilität noch begrenzt ist.
Für Folia-kompatibles Scheduling müssen Plugin-Entwickler die neue API verwenden:
// Folia-kompatibler Task auf einer bestimmten Locations Region
server.getRegionScheduler().runAtFixedRate(plugin, location, task -> {
// läuft auf dem Thread, der diese Region besitzt
}, 1L, 20L);
Task-Gesundheit über Zeit überwachen
Scheduler-Gesundheit ist keine einmalige Aufgabe — neue Plugin-Updates können problematische Tasks wieder einführen, und Spielerzahlenwachstum verändert die Auswirkung von O(n)-Tasks erheblich. Regelmäßige Profiling-Sessions und das Verfolgen von TPS-Trends über Zeit helfen dir, Rückschritte früh zu erkennen.
Hier wird ein Tool wie [PulseNode](https://pulsenode.tech) wertvoll — durch kontinuierliches Monitoring deiner Server-TPS und Benachrichtigungen bei Performance-Verschlechterungen kannst du Einbrüche mit Plugin-Updates oder Spielerzahlveränderungen korrelieren, bevor sie zu Spieler-sichtbaren Problemen werden.
Zusammenfassung: Die wichtigsten Erkenntnisse
- Synchrone, wiederholte Tasks sind eine direkte Steuer auf dein Haupt-Thread-Tick-Budget
- Nutze Spark oder Paper Timings, um zu identifizieren, welche Tasks die meiste CPU verbrauchen
- Erhöhe Task-Intervalle, bevorzuge async Ausführung und verwende event-getriebene Logik wo immer möglich
- Prüfe All-in-One-Plugin-Konfigurationen und deaktiviere nicht genutzte Features
- Erwäge Folia für große Server, die echtes Multithreading-Scheduling benötigen
- Überwache regelmäßig — Task-Overhead skaliert mit der Spieleranzahl
Deinen Scheduler zu optimieren ist eine der wirkungsvollsten Änderungen, die du vornehmen kannst. Im Gegensatz zu Hardware-Upgrades oder Config-Anpassungen bringt das Beheben missbräuchlicher Task-Planung oft dramatische TPS-Verbesserungen — kostenlos und ohne jede Auswirkung für Spieler.
---
Willst du sofort wissen, wenn deine TPS zu sinken beginnen? [PulseNode](https://pulsenode.tech) bietet dir Echtzeit-Server-Monitoring mit intelligenten Alerts, damit du Scheduling-Rückschritte erkennst, bevor deine Spieler es tun. Heute kostenlos testen.