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

Libro blanco del lag en juegos › L9 Proceso del juego en el servidor

Deadlock Deadlock

ID de la causa sp-deadlock · Responsable principal Desarrollo de servidor (Equipo de desarrollo)

Abrir la ficha interactiva con gráficos y simulaciones →

Si dos hilos esperan cada uno el lock que tiene el otro, se quedan detenidos para siempre.

Por qué El hilo A tiene el lock 1 y espera el lock 2; B tiene el lock 2 y espera el lock 1 → Efecto Los dos se quedan detenidos para siempre, y los hilos relacionados también se detienen uno tras otro → En pantalla Todo el servidor se detiene y, cuando el watchdog lo reinicia, se desconecta a todos los jugadores

Síntomas
Congelamiento, Desconexión
Factores
Detención
A quién afecta
Todo el servidor, Solo una función
Cuándo
De vez en cuando, al azar, Cuando se junta mucha gente
Responsable
Responsable principal Desarrollo de servidor (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Definir un orden fijo para adquirir los locks, usar locks con timeout, tener un watchdog y guardar un volcado de hilos en el momento de la detención.
En el gráfico
Desconexión masiva · Número de conexiones, volumen enviado por el servidor
Dónde mirar
Pilas de llamadas de todos los hilos durante la detención. En la JVM, jstack (detecta y marca los deadlocks automáticamente); en .NET, dotnet-stack; en servidores nativos, thread apply all bt de gdb, o generar un archivo core con gcore, reiniciar y analizarlo después
Se confirma si
Dos o más hilos están detenidos con pilas que esperan el lock que tiene el otro, y mientras tanto el uso de CPU del proceso está cerca de 0
Se descarta si
Si durante la detención un hilo gira al 100% de CPU, es un bucle infinito. Si los hilos esperan respuestas de la BD o de servicios externos, apunta a llamadas síncronas o a “Agotamiento del pool de hilos”
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)

Fuentes

  1. Runtime locking correctness validator Linux kernel
    Adquirir dos locks en orden inverso provoca una espera circular y un deadlock (lock inversion deadlock); el kernel de Linux comprueba el orden de los locks y avisa de antemano
  2. Liveness, Readiness, and Startup Probes Kubernetes
    Detectar con una sonda de liveness un deadlock (el proceso se ejecuta pero no avanza) y reiniciar el contenedor
  3. Diagnostic Tools (Java SE 21 Troubleshooting Guide) Oracle
    jstack imprime las pilas de todos los hilos de una JVM en ejecución y también detecta y marca los deadlocks (Found one Java-level deadlock)
  4. dotnet-stack diagnostic tool - .NET CLI Microsoft
    Captura e imprime las pilas administradas de todos los hilos de un proceso .NET
  5. Threads (Debugging with GDB) GNU Project
    Ejecutar el mismo comando en todos los hilos con thread apply all (bt: imprimir la pila de llamadas)
  6. gcore(1) — Linux manual page gdb
    Genera un archivo core del programa en ejecución, y el programa sigue ejecutándose después

Ver también

Misma capa: L9 Proceso del juego en el servidor

Causas de otras capas con el mismo síntoma (Congelamiento)

Ver la ficha interactiva con gráficos y simulaciones