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

Game-Lag-Whitepaper › L9 Spielprozess auf dem Server

Deadlock Deadlock

Ursachen-ID sp-deadlock · Hauptzuständig Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Wartet jeder von zwei Threads auf den Lock, den der andere hält, stehen beide für immer still.

Warum Thread A hält Lock 1 und wartet auf Lock 2, B hält Lock 2 und wartet auf Lock 1 → Folge Beide stehen für immer still, abhängige Threads bleiben nacheinander ebenfalls hängen → Auf dem Bildschirm Ganzer Server steht still, Watchdog startet neu, Verbindungsabbruch für alle

Symptome
Freeze, Verbindungsabbruch
Faktoren
Stillstand
Wer ist betroffen
Ganzer Server, Nur eine bestimmte Funktion
Wann
Gelegentlich, zufällig, Bei großem Andrang
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Regeln für die Lock-Reihenfolge, Locks mit Timeout, Watchdog einsetzen und im Moment des Stillstands einen Thread-Dump schreiben.
Im Graphen
Verbindungen brechen gleichzeitig ab · Verbindungen, Sendevolumen des Servers
Wo nachsehen
Während des Stillstands die Call-Stacks aller Threads sichern. JVM: jstack (findet und markiert Deadlocks automatisch), .NET: dotnet-stack, native Server: thread apply all bt in gdb oder mit gcore eine Core-Datei schreiben und nach dem Neustart analysieren
Spricht dafür
Zwei oder mehr Threads hängen mit Stacks, in denen jeder auf den Lock des anderen wartet, und die CPU-Auslastung des Prozesses liegt währenddessen nahe 0
Spricht dagegen
Ein Thread läuft während des Stillstands mit 100 % CPU: Endlosschleife. Threads warten auf DB oder externe Antworten: eher synchrone Aufrufe oder ein erschöpfter Thread-Pool
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)

Quellen

  1. Runtime locking correctness validator Linux kernel
    Werden zwei Locks in entgegengesetzter Reihenfolge genommen, entsteht durch zirkuläres Warten ein Deadlock (lock inversion deadlock), der Linux-Kernel prüft die Lock-Reihenfolge und warnt vorab
  2. Liveness, Readiness, and Startup Probes Kubernetes
    Ein Deadlock, bei dem die Anwendung läuft, aber nicht vorankommt, wird per Liveness-Probe erkannt und der Container neu gestartet
  3. Diagnostic Tools (Java SE 21 Troubleshooting Guide) Oracle
    jstack gibt die Stacks aller Threads einer laufenden JVM aus und findet und meldet auch Deadlocks (Found one Java-level deadlock)
  4. dotnet-stack diagnostic tool - .NET CLI Microsoft
    Erfasst die verwalteten Stacks aller Threads eines .NET-Prozesses und gibt sie aus
  5. Threads (Debugging with GDB) GNU Project
    thread apply all führt denselben Befehl für alle Threads aus (bt: Call-Stack ausgeben)
  6. gcore(1) — Linux manual page gdb
    Erstellt eine Core-Datei eines laufenden Programms, das Programm läuft danach unverändert weiter

Verwandte Ursachen

Gleiche Schicht: L9 Spielprozess auf dem Server

Ursachen aus anderen Schichten mit demselben Symptom (Freeze)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen