-
Notifications
You must be signed in to change notification settings - Fork 0
Performance Guide
← Home · Zurück: Server-Konfiguration
Alles über Performance des Project-Zomboid-B42-Servers: Memory/JVM, Storage,
CPU-Optionen, Modlisten-Budget und Schnelldiagnose. Basis ist die
Repo-Checkliste docs/09-performance.md (vollständig übernommen), erweitert
um gelabeltes Community-Wissen aus den B42-Tuning-Guides.
Label-Legende: (Repo-Default) = das Repo setzt diesen Wert 1:1 in Template/Skript. (Community-Quelle: X) = extern belegt. (Heuristik) = begründete Empfehlung dieses Wikis / der Repo-Doku, kein offizieller Wert. The Indie Stone (TIS) veröffentlicht KEINE offiziellen Performance-Specs — jede Zahl hier ist Community- oder Repo-Wissen, nie eine TIS-Vorgabe.
(aus docs/09) Build 42 (stable seit 29.07.2026 — Community-Quelle:
Enzyklopädie/Release-Historie, Repo-Doku) verlagert die Last in neue
Systeme: Echtzeit-Lichtpropagation, bis zu 32 Stockwerke pro Chunk
(I/O-Spitzen), Tiersimulation und tiefere Crafting-Systeme laufen permanent
im Hintergrund — auch wenn niemand kämpft. B41-Regeln („4-6 GB reichen")
gelten nicht mehr. Community-Beobachtung: B42 braucht ≈2 GB mehr RAM als
ein vergleichbarer B41-Server.
Dazu das Threading-Modell (Community-Quelle, single-source auf exakte Anteile): Die Hauptsimulation (Zombie-KI/Pfadfindung, Lighting, Chunk-Work) läuft single-threaded auf einem Kern; nur Netzwerk-I/O und Speichern können andere Threads nutzen. Mehr Kerne helfen der Simulation nicht — höhertaktige Kerne schon.
Kanonik (Host-RAM-Klasse → empfohlener Heap) — dieselbe Tabelle steht in
ENV-Variablen, Quickstart-Linux und Hardware-Empfehlungen
(Spalten dort: „Host-RAM" und „Heap Xmx"); Quelle ist der B42-Optimierungs-Guide
b42-server-optimization-checklist.md.
| Klasse | Host-RAM (Gesamt) | Empfohlenes Heap Xmx | Label |
|---|---|---|---|
| Small | ≤ 8 GB | 6–8 GB | Community-Quelle: B42-Optimierungs-Guide |
| Medium | 8–24 GB | 10–14 GB | Community-Quelle: B42-Optimierungs-Guide |
| Large / Modded | 24+ GB | 16 GB | Community-Quelle: B42-Optimierungs-Guide |
Diese Sicht ist eine Ableitung aus derselben Faustformel, nicht eine
eigenständige Tier-Logik — die Zahlen müssen mit der Host-RAM-Klassen-Tabelle
oben übereinstimmen (Heuristik, Repo-Doku docs/09):
| Profil | Spieler/Mods | Empfohlener Heap | Label |
|---|---|---|---|
| Small | bis 8 Spieler, vanilla/leichte Mods | 6–8 GB | (Heuristik, abgeleitet aus Faustformel) |
| Medium | 8–24 Spieler, Standard-Modpacks | 10–14 GB | (Heuristik, abgeleitet aus Faustformel) |
| Large/Modded | 24+ Spieler oder schwere Mods | 16 GB | (Heuristik, abgeleitet aus Faustformel) |
Faustformel (Heuristik): ~6 GB Basis + 0,5 GB/Spieler, stark gemoddet
+2-4 GB Mod-Puffer (Repo-Doku docs/09; Community-Beobachtung: B42
stark-gemoddet landet oft bei 14-16 GB unabhängig von der Slotzahl).
Repo-Default: RAM_XMX=12G für 8 Spieler + die Repo-Modliste (1:1 aus
.env.example).
Host-RAM-Rechnung (Community-Quelle): 16 GB Heap erfordern einen Host
mit mindestens 24 GB RAM — dem OS müssen ~6-8 GB für Page-Cache und
Chunk-Streaming bleiben, sonst swappt das System, was schlimmer ist als ein
kleinerer Heap. Bei 16 GB Host-RAM also max. 12-13G Heap (aus docs/09).
-
-Xmsgleich-Xmxsetzen — kein Re-Sizing zur Laufzeit, keine Resize-Pausen, planbarer Footprint (Community-Quelle: Hosting-Guides; Konsens). Caveat (Community-Quelle, single-source): Wer allen RAM sofort reserviert, kann den OS-Page-Cache aushungern — deshalb die Host-Rechnung oben. -
Repo-Weg (systemd): Das Repo setzt NUR
-Xmx:zomboid.servicestartet mit-Xmx${RAM_XMX}aus der.env(1:1 aus dem Service-File). Ein-Xms-Flag setzt der systemd-Pfad des Repos NICHT — wer Xms=Xmx will, ergänzt es am Start-Skript/Service (Anpassung außerhalb des unveränderten Repo-Stands; der Wertebereich stammt ausdocs/09). -
Windows-Weg (aus
docs/09): Flags inProjectZomboid64.jsonuntervmArgs, z. B."-Xms12g", "-Xmx12g". Siehe Setup-Windows.
| Frage | Antwort | Label |
|---|---|---|
| Standard-Empfehlung | G1GC — kürzere GC-Pausen statt seltener langer; besser bei B42-Allokationsdruck (Crafting + Tiersimulation) | aus docs/09; Community-Quelle: Hosting-Guides (Community-disputiert, kein Konsens) |
-XX:MaxGCPauseMillis |
200 ist der Standardwert; 50 ist eine konservative Alternative (kürzere einzelne Pausen, weniger Durchsatz) | 200=Standard: Community-Quelle JVM/Hosting-Guides; 50=Heuristik; docs/09 nennt 50 |
| ZGC | Sehr niedrige Pausen; nur für sehr große Heaps evaluieren | Heuristik (EN-Guide: ZGC ist Default gewisser Docker-Images — unseres ist ein anderes, siehe Docker-Betrieb) |
| Flags setzen | Repo setzt KEINEN GC-Flag — Ergänzung wie oben über vmArgs/Start-Skript | Repo-Stand |
Praxisregel (Heuristik, aus der Community): Ruckler bei Spielern → GCPauseMillis senken; CPU dauerhaft in GC → erhöhen. Immer nur eine Schraube drehen und danach messen.
(aus docs/09) make logs nach OutOfMemoryError durchsuchen → RAM_XMX
in .env erhöhen → make restart. Der Healthcheck des Repos greift
OutOfMemory im 5-Minuten-Fenster automatisch ab (siehe
Monitoring-und-Alerts).
Verifizieren, dass Flags angekommen sind (Community-Quelle: EN-Guide, Standard-HotSpot-Tooling):
ps -ef | grep -E 'java.*zomboid|ProjectZomboid' | grep -o -- '-Xm[sx][^ ]*'
jcmd <pid> GC.heap_info # Heap-Snapshot
# GC-Log aktivieren (Analyse nach Lastspitzen):
# -Xlog:gc:file=gc.log:time,uptime,level,tagsB42 streamt bis zu 32 Etagen Voxel-Daten pro Chunk — Hauptgrund für
Micro-Freezes beim Betreten von Städten und bei Autofahrten (aus docs/09).
| Storage | Eignung | Praxis | Label |
|---|---|---|---|
| HDD | Ungeeignet | Spürbare Ladeblöcke | aus docs/09; Symptomlage Community-Quelle: Vendor-Beobachtungen |
| SATA SSD | Akzeptabel | Minimum für kleine Gruppen | aus docs/09 (Guide-Empfehlung) |
| NVMe | Sehr gut | Empfohlener Standard | aus docs/09 (Guide-Empfehlung) |
| PCIe Gen4 NVMe | Ideal | Bei mehreren gleichzeitig fahrenden Spielern | aus docs/09 (Guide-Empfehlung) |
Es gibt KEINE offiziellen TIS-IOPS/MB/s-Specs — Vendor-Zahlen sind Marketing, keine B42-Anforderung (Community-Quelle: Storage-Guide-Recherche). Messen statt glauben, siehe Schnelldiagnose unten.
Weitere Punkte aus docs/09:
- NVMe für Server + Saves — kein HDD-Betrieb.
-
Antivirus-Ausschluss: B42 nutzt ein neues SQLite-Format für den
Map-Cache; Echtzeit-Scanner sperren die Dateien → I/O-Locks. Ausschluss
für
Zomboid/Saves/Multiplayer/(betrifft v. a. Windows-Hosts). - Fahrzeug-Tempo begrenzen (Sandbox): Vollgas durch dichte Gebiete erzwingt Echtzeit-Chunk-Loads → Rubber-Banding. Eher Chunk- als Netzwerkproblem.
Schwellwerte als Starthilfen, NICHT vendor-dokumentiert (alles Heuristik):
Metrik (iostat -x/vmstat) |
Gesund | Degradiert | Kritisch |
|---|---|---|---|
Device await
|
<1 ms | 1-5 ms | >5 ms anhaltend |
Device %util
|
<50 % | 50-85 % | >85 % anhaltend |
CPU iowait
|
<2 % | 2-10 % | >10 % |
| Save-Burst-Dauer | <2 s | 2-5 s | >5 s |
iostat -x 2 # Device-Latenz/-Auslastung (Paket sysstat)
pidstat -d -p $(pgrep -fi zomboid) 2 # Disk-Aktivitaet des JVM-Prozesses
vmstat 2 # iowait (Spalte wa), Swap-DruckAuswertungslogik (Heuristik, Storage-Guide): await + iowait gemeinsam
erhöht = starker Storage-Verdacht; beide gesund → JVM/GC, Zombie-Dichte,
Netzwerk prüfen. Messung immer mit Spielerbericht und Save-Zeitpunkt
korrelieren; Einzelmessungen weniger wert als wiederholbare Muster.
Das Repo hat KEIN tmpfs-Setup — alles Folgende ist ein_optionaler_
Ausbau aus dem Storage-Guide (Standard-Linux-tmpfs+rsync-Muster, keine
TIS-Empfehlung; Heuristik): Zomboid/Saves/Multiplayer auf tmpfs legen,
Größe ≈ aktuelle Save-Größe × 1,5, plus Boot-Seed-Service, Sync-Back-Timer
(z. B. alle 5 Min) und ExecStop-rsync. Risiko-Box des Guides: RAM-Disk ist
KEIN Backup; Stromverlust kostet alles seit dem letzten Sync; die
Kapazitätsrechnung (Heap + Saves + 8 GB OS-Reserve + Puffer) muss aufgehen —
auf einem 24-GB-Host mit 12G Heap bleibt dafür wenig Luft. Empfehlung
(Heuristik): erst NVMe, tmpfs nur bei großer RAM-Reserve experimentell.
Diese Performance-Optionen sind im Repo-Template
config/templates/servertest.ini.tmpl voreingestellt (Werte 1:1 =
Repo-Default; die Werte selbst stammen aus der Community — Community-Quelle:
Hosting-Guides, single-source):
# Virtuelle Zombies: begrenzt teure Echtzeit-Updates
ZombieUpdateMaxHighPriority=50 # max. Zombies mit voller Update-Rate
ZombieUpdateDelta=0.5 # Sekunden zwischen Zombie-Bulk-Updates
ZombieUpdateRadiusHighPriority=10.0 # Radius volle Sim (0.0 = altes Verhalten)
ZombieUpdateRadiusLowPriority=45.0 # dahinter nur noch Low-Prio-Updates
# B42-Lighting: Echtzeit-Lichtpropagation ist ein Dauer-CPU-Verbraucher
LightingUpdateInterval=0.5
# Welt-Hygiene
HoursForWorldItemRemoval=48
RemovePlayerCorpsesOnCorpseRemoval=true
SaveWorldEveryMinutes=15
PauseEmpty=trueBegründungen (aus docs/09):
-
Zombie-Update-Settings: Entfernte Zombies werden nur gebündelt und
verzoegert aktualisiert — bei 8 Spielern quasi unsichtbar, bei großen
Horden um Basen der Unterschied zwischen 60 und 20 TPS (Angabe aus
docs/09). Hintergrund (Community-Quelle): Distanz-Zombies sind „virtuell" — weniger Dichte/Updates = weniger Arbeit für den einzelnen Simulations-Thread. -
LightingUpdateInterval=0.5: Höheres Intervall = weniger CPU,
Lichtwechsel wirken minimal verzögert. WICHTIG (aus
docs/09): Dieser Key ist B42-neu — nach erstem Boot im Log verifizieren, dass er greift (Keys werden zwischen Builds gelegentlich umbenannt; unbekannte Keys werden still ignoriert). Zu zirkulierenden angeblichen Lighting-Keys, die NICHT existieren: Mythen-Kasten in Server-Konfiguration. -
Welt-Hygiene:
HoursForWorldItemRemoval=48undRemovePlayerCorpsesOnCorpseRemoval=truehalten Item- und Leichen-Berge klein (Datenmüll = RAM + CPU). -
SaveWorldEveryMinutes=15= Autosave-Intervall (Repo-Default). -
PauseEmpty=true= Server pausiert ohne Spieler, verbraucht dann fast nichts (Repo-Default).
Ergänzung aus der Community (NICHT im Repo-Template, Community-Quelle:
EN-Optimierungs-Guide): TrashDeleteAll=true räumt fallen gelassenen
Müll aggressiv weg — für lange laufende Welten empfohlen, um Memory flach
zu halten.
Im Preset config/presets/sandbox/coop-balanced.lua gesetzt (Preset-Werte =
Repo-Default); bei Lag hier drehen (Empfehlungen aus docs/09 = Heuristik
der Repo-Doku):
| Setting | Preset-Wert | Bei Lag | Wirkung |
|---|---|---|---|
Zombies |
4 (Normal) | 5 (Low) | Größter einzelner CPU-Faktor. Skala INVERTIERT: 1=Insane, 4=Normal, höhere Zahl = weniger Zombies |
PopulationMultiplier |
1.0 | 0.65 | Gesamt-Population (4.0=Insane ... 0=None) |
RespawnHours |
0 | 0 lassen | 0 = kein Respawn = keine Respawn-Berechnung |
ErosionSpeed |
Default | 3 | Höher = mehr Berechnung |
CarSpawnRate |
3 | 2 | Fahrzeuge sind teure Entities |
BloodLevel |
1 | 1 lassen | Blut-Decals akkumulieren RAM |
HoursForCorpseRemoval |
72 | 24-48 | Leichen sind Datenmüll |
Weitere Werte des Presets (Repo-Default, 1:1): LootRespawn=1 (aus),
DayLength=3, XpMultiplier=1.5, SleepAllowed=false, PVP=false,
SafetySystem=true, Safehouse=true, PlayerSafehouse=true.
Community-Einordnung (EN-Guide): PopulationMultiplier senken ist der
größte CPU-Hebel überhaupt, weil weniger Zombies je in die Live-Simulation
befördert werden (virtuelles Zombie-System).
Population über die Zeit steuern (Community-Quelle: pzwiki-Sandbox-Defaults).
Genauer Repo-Stand des Presets: PopulationStartMultiplier = 0.8 und
PopulationPeakMultiplier = 1.5 sind bereits gesetzt (Repo-Default, 1:1 aus
coop-balanced.lua); PopulationPeakDay fehlt im Preset und kann bei
Bedarf ergänzt werden. Die Beispielwerte 0.65/1.0/28 stammen aus dem
EN-Guide (Community-Quelle bzw. Heuristik des Leitfadens, keine
TIS-Vorgabe):
PopulationMultiplier = 0.65, -- EN-Guide-Beispiel; Repo-Default: 1.0
PopulationStartMultiplier = 1.0, -- EN-Guide-Beispiel; Repo-Default: 0.8
PopulationPeakMultiplier = 1.5, -- EN-Guide-Beispiel; zugleich Repo-Default
PopulationPeakDay = 28, -- EN-Guide-Beispiel; nicht im PresetWarnung: Wer das Low-Lag-Beispiel übernimmt, überschreibt den Repo-Default
PopulationStartMultiplier = 0.8 („sanfter Einstieg") still mit 1.0 —
bewusst entscheiden, nicht blind kopieren; nicht gesetzte Keys behalten
ihre Vorgabewerte.
Cache-Neuaufbau nach Populations-Änderung (Community-Quelle,
single-source): Der Server cached die Zombie-Karte in zpop_*.bin im
World-Save-Verzeichnis. Nach Änderungen an Population-/Update-Optionen:
# im World-Save-Verzeichnis (z. B. /opt/pzserver/Zomboid/Saves/Multiplayer/<server>/)
rm zpop_*.bin # sicher: Spieler-/Item-/Safehouse-Daten liegen woanders…und Server neu starten, damit die Populations-Karte neu aufgebaut wird.
(aus docs/09, erweitert)
-
Budget: Jede Mod kostet RAM + Startup-Zeit + Per-Tick-CPU. Grobe
Obergrenze ~30 Mods auf moderater Hardware (Heuristik aus
docs/09). -
RAM-Aufschlag: stark gemoddet +2-4 GB über Baseline (
docs/09) — damit landet man im Large-Tier 24+/16 GB der Tabelle oben (Community-Quelle). -
Eine Mod nach dem anderen aktivieren, dazwischen
make status— nie 10 gleichzeitig, sonst ist der Verursacher nicht isolierbar (docs/09; Modliste verwalten: Mods-Referenz). -
Log-Spam = Lag-Indikator:
make logsnach Warnungs-Dauerfeuer durchsuchen. Praxisfall des Repos: Neat Building mitInvalid SpriteConfig object!-Spam (Aug 2026) → im Repo deaktiviert (Repo-Erfahrung ausdocs/09). -
Doppel-Funktionen vermeiden: nur EIN Waffen-Overhaul, EIN
Inventar-System, EINE Karten-Erweiterung pro Region (
docs/09). -
Karten-Mods sind die teuersten: jede zusätzliche Karte = mehr
Chunk-Daten + längere Ladezeiten + höherer Save-Ordner (
docs/09). -
Load-Order: Eintragsreihenfolge in
Mods=/WorkshopItems=ist die Lade-Reihenfolge — Frameworks zuerst (Community-Quelle; das Repo erzeugt die Reihenfolge automatisch ausmods.yaml-Kategorien, siehe Modding-Workflow). DieMap=-Zeile: semikolongetrennte interne Ordnernamen, frühere Maps gewinnen,Muldraugh, KYimmer zuletzt (Community-Quelle: Repo-Changelog 0.3.0 + docs). Eine sehr lange Map=-Zeile ist auch ein Ladezeiten-Treiber (Heuristik aus dem EN-Guide: jede Karte addiert Chunk-Daten).
(aus docs/09)
-
Geplante Neustarts alle 12-24h gegen Memory-Fragmentierung — im Repo
automatisch abgedeckt: Backup-Timer 04:00 täglich (systemd-Timer,
Repo-Default) + Update-Timer Di 03:00 (Werte aus
.env.example:UPDATE_DAY=Tue,UPDATE_TIME=03:00; das systemd-Timer-File templated sie nur — siehe Wartung-und-Automatik). - PauseEmpty=true (Repo-Default im Template) — leerer Server verbraucht fast nichts.
-
Monitoring:
make status(Prozess/Port/Log) +make logs— Details Monitoring-und-Alerts. -
Baseline messen: nach frischem Restart TPS/Last notieren, nach 3
Tagen Betrieb vergleichen — driftet es, hilft der Restart-Rhythmus oder
ein Mod-Audit (Heuristik aus
docs/09). - Backups außerhalb der Spielzeiten platzieren (Heuristik: der 04:00-Default des Repo-Timers passt zu abendlicher Coop-Zeit; wer nachts spielt, verschiebt — siehe Backup-und-Restore).
Wenn Software nicht mehr reicht (aus docs/09, Reihenfolge dort 1-4):
-
Single-Core-Takt — PZ skaliert kaum über Kerne; die Simulation ist
single-threaded (Community-Quelle).
docs/09nennt als Beispiele Ryzen 7950X/9950X; die Community zielt auf ~4,5 GHz Boost minimum (Community-Quelle, single-source). - NVMe Gen4 — Chunk-Streaming (Abschnitt 2).
- RAM — stabil und ausreichend, nicht maximal: der Heap-Tier-Rechnung aus Abschnitt 1 folgen, OS-Puffer einplanen.
-
Upload — 10+ Mbit/s stabil für 8 Spieler (aus
docs/09).
NICHT erwarten: Der Server nutzt N Kerne für die Simulation — er tut es nicht, egal welche Flags (Community-Quelle; wer das behauptet, verbreitet Fehlinformation).
Erweitert aus docs/09 um konkrete Messbefehle:
| Symptom | Messung | Typische Ursache | Siehe auch |
|---|---|---|---|
| Rubber-Banding beim Fahren |
iostat -x 2 (await/%util), Spieler-Tempo |
Chunk-Loading (Storage/CPU) | Abschnitt 2; Ports-und-Netzwerk für Netzweg |
| Micro-Freezes in Städten |
iostat -x 2, vmstat 2 (wa) |
32-Etagen-I/O | Abschnitt 2 |
| „Black Box"-Tiles | CPU-Auslastung pidstat -t / htop (pro Kern) |
Licht-/CPU-Last im Sim-Thread | Abschnitt 3 (LightingUpdateInterval, mit Verifikationshinweis) |
| Zombie-Pop-in | SandboxVars ansehen | Population zu hoch | Abschnitt 4 |
| Disconnects nach Stunden |
make logs nach OutOfMemoryError; jcmd <pid> GC.heap_info
|
Memory-Fragmentierung/OOM | Abschnitt 1 |
| Ruckler in regelmäßigen Abständen | Save-Zeitpunkte ins Log korrelieren | Autosave-Bursts (alle 15 Min, Repo-Default) auf langsamem Storage | Abschnitte 2 + 6 |
| Hohe GC-Pausen | GC-Log (-Xlog:gc), jcmd <pid> GC.heap_info
|
Heap zu klein / GC-Tuning | Abschnitt 1 |
| Dauerhafter IO-Wait |
iostat -x 5: %util/await >70 % unter normaler Last (Community-Quelle, single-source-Schwelle) |
Save-Device gesättigt (Backups/andere Jobs concurrent?) | Abschnitte 2 + 6 |
| Lange Join-Zeiten (bestehender Server) | Mod-Anzahl vs. Tier-Tabelle | Mod-Budget/RAM | Abschnitte 1 + 5 |
(Join-Verzögerung beim allerersten Boot einer frischen Welt ist normal — Weltgenerierung; siehe Troubleshooting.)
Zu erfundenen Performance-Optionen, die in Foren kursieren und NICHT existieren (unbekannte ini-Keys werden still ignoriert): Mythen-Kasten in Server-Konfiguration. Hier bewusst nicht wiederholt.
Vertieft in Repo: docs/09-performance.md (Checklisten-Original),
.env.example (RAM_XMX), config/templates/servertest.ini.tmpl,
config/presets/sandbox/coop-balanced.lua.
Weiter: Troubleshooting · Monitoring-und-Alerts · Wartung-und-Automatik
Labels: Community-Quelle = extern belegt (Herkunft in Klammern, z. B. pzwiki, Steam-Diskussionen, GCP-Preisliste) · Repo-Default = steht genau so im Repo (Template, Skript oder .env.example) · Heuristik = begründete Empfehlung dieses Projekts, nicht extern verifiziert.
The Indie Stone (TIS) publiziert keine offiziellen Storage-/IOPS-/Performance-Specs — Zahlen in diesem Wiki nie als TIS-Anforderung lesen.
Inhalte zielen auf den B42-Stable-Branch: seit B42.20 der Default-Zweig in Steam, kein -beta-Opt-in nötig (Community-Quelle).
Details zu Labels, Quellen und Redaktionsregeln: Konventionen-und-Quellen.
Einstieg
Referenz
- Makefile-Referenz
- Cheatsheet-Tagesbetrieb
- ENV-Variablen
- Server-Konfiguration
- Admin-Befehle
- Mods-Referenz
- Spawn-System
- Skripte-Referenz
- systemd-Referenz
- Ports-und-Netzwerk
- SteamCMD-Referenz
Betrieb
- Wartung-und-Automatik
- Backup-und-Restore
- Updates-und-Rollback
- Monitoring-und-Alerts
- Sicherheit-und-Hardening
- Docker-Betrieb
- GCP-Failover
Tiefenwissen
- Modding-Workflow
- Performance-Guide
- Storage-und-Map-Streaming
- Hardware-Empfehlungen
- Troubleshooting
- Runbook-Raven-Creek
Meta