한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Game-Lag-Whitepaper › L10 Arbeitsspeicher

Speicherleck Memory leak

Ursachen-ID mem-leak · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Nicht freigegebener Speicher sammelt sich nach und nach an und führt Tage später zu GC-Stürmen, Swapping oder zum erzwungenen Beenden des Prozesses.

Warum Daten ausgeloggter Charaktere und Event-Handler werden nicht freigegeben → Folge Freier Speicher nimmt über mehrere Tage ab → Auf dem Bildschirm Direkt nach der Wartung unauffällig, mit jedem Tag mehr Lag, am Ende fällt der Server aus

Symptome
Zeitlupe, Freeze, Verbindungsabbruch
Faktoren
Stillstand
Wer ist betroffen
Ganzer Server
Wann
Je länger es läuft, Abendliche Stoßzeit
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Heap-Dumps analysieren, Langzeit-Lasttests durchführen.
Aufgaben Infrastrukturteam
Trend des Speicherverbrauchs pro Prozess überwachen und Alarme dafür einrichten.
Im Graphen
Langsamer Anstieg · Prozessspeicher (RSS), Heap nach der GC
Wo nachsehen
Speicher des Spielserverprozesses (RSS aus pidstat -r) über mehrere Tage verfolgen, bei Servern mit GC den direkt nach der GC verbleibenden Heap. Java: der Wert nach der GC aus der Vorher-/Nachher-Belegung in den -Xlog:gc-Zeilen, .NET: Heap-Größe nach der GC in dotnet-counters (ab .NET 9 dotnet.gc.last_collection.heap.size, bis 8 GC Heap Size)
Spricht dafür
Der direkt nach der GC verbleibende Heap (Grundlinie) steigt nach dem Neustart jeden Tag und sinkt auch in den ruhigen frühen Morgenstunden nicht
Spricht dagegen
Heap-Grundlinie flach, nur RSS steigt: Fragmentierung (mem-fragment) oder nativer Speicher. Steigt und fällt mit der Spielerzahl: normaler Verbrauch
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Wird der Server bei der regelmäßigen Wartung jede Woche neu gestartet, bleibt ein Leck verdeckt und lange unentdeckt. Oft tritt es plötzlich zutage, wenn eine Wartung einmal verschoben wird oder ein Event mehr Spieler bringt.

Quellen

  1. Troubleshoot Memory Leaks Oracle
    Wird die Ausführung allmählich langsamer, liegt ein Leck nahe, am Ende geht der Speicher aus und das Programm bricht ab. Wichtigste Grundlage der Leckanalyse ist ein Heap-Dump
  2. Debug a memory leak in .NET .NET
    Auch mit GC entsteht ein Leck, wenn nicht mehr benötigte Objekte weiter referenziert werden, Folge sind Leistungseinbußen und OutOfMemoryException. Speichertrend prüfen und Dumps analysieren
  3. Garbage Collector Implementation Oracle
    -Xlog:gc-Zeilen haben das Format „Belegung vor der GC->Belegung nach der GC(Heap-Größe)“
  4. dotnet-counters diagnostic tool .NET
    Ab .NET 9 Anzeige als dotnet.gc.last_collection.heap.size, bis .NET 8 als GC Heap Size
  5. pidstat(1) — Linux manual page sysstat
    -r: RSS pro Prozess (tatsächlich im RAM liegender Speicher) und Page Faults

Verwandte Ursachen

Gleiche Schicht: L10 Arbeitsspeicher

Ursachen aus anderen Schichten mit demselben Symptom (Zeitlupe)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen