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

Guia do Lag em Jogos › L9 Processo do jogo no servidor

Deadlock Deadlock

ID da causa sp-deadlock · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)

Abrir o card interativo, com figuras e simulações →

Quando duas threads esperam, cada uma, o lock que a outra segura, as duas ficam paradas para sempre.

Por quê A thread A segura o lock 1 e espera o lock 2; a B segura o lock 2 e espera o lock 1 → Efeito As duas param para sempre, e as threads relacionadas vão parando em cadeia → Na tela O servidor inteiro para, e o watchdog o reinicia: desconexão de todos

Sintomas
Travamento, Desconexão
Fatores
Paralisação
Quem é afetado
Servidor inteiro, Só um recurso específico
Quando
Aleatoriamente, de vez em quando, Quando junta muita gente
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Definir uma regra de ordem para os locks, usar locks com timeout, ter um watchdog e gravar um thread dump no momento da parada.
No gráfico
Queda de conexões em massa · Conexões, volume enviado pelo servidor
Onde olhar
Capturar as pilhas de chamadas de todas as threads durante a parada. Na JVM, jstack (detecta e mostra deadlocks automaticamente); no .NET, dotnet-stack; em servidores nativos, thread apply all bt no gdb, ou gerar um core file com gcore, reiniciar e analisar depois
Confirma se
Duas ou mais threads estão paradas em pilhas que esperam o lock que a outra segura, e enquanto isso o uso de CPU do processo fica perto de 0
Descarta se
Uma thread rodando a 100% de CPU durante a parada: loop infinito. Threads esperando resposta do BD ou de serviços externos: aponta para chamadas síncronas ou esgotamento do pool de threads
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. Runtime locking correctness validator Linux kernel
    Pegar dois locks em ordem inversa causa espera circular e deadlock (lock inversion deadlock); o kernel Linux verifica a ordem dos locks e avisa antes
  2. Liveness, Readiness, and Startup Probes Kubernetes
    A liveness probe detecta um deadlock (o processo roda, mas não avança) e reinicia o contêiner
  3. Diagnostic Tools (Java SE 21 Troubleshooting Guide) Oracle
    jstack imprime as pilhas de todas as threads de uma JVM em execução e também detecta deadlocks (Found one Java-level deadlock)
  4. dotnet-stack diagnostic tool - .NET CLI Microsoft
    Captura e imprime as pilhas gerenciadas de todas as threads de um processo .NET
  5. Threads (Debugging with GDB) GNU Project
    thread apply all executa o mesmo comando em todas as threads (bt: imprime a pilha de chamadas)
  6. gcore(1) — Linux manual page gdb
    Gera um core file do programa em execução, e o programa continua rodando normalmente depois

Veja também

Mesma camada: L9 Processo do jogo no servidor

Mesmo sintoma (Travamento) em outras camadas

Ver o card interativo, com figuras e simulações