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

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

Esgotamento do pool de threads Thread pool starvation

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

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

Quando todas as worker threads que processam tarefas ficam presas em trabalhos lentos, os pedidos novos ficam esperando indefinidamente.

Por quê As worker threads ficam presas esperando resposta de APIs externas ou do BD → Efeito Não há thread livre para os pedidos novos → Na tela Loading infinito em recursos específicos, como login ou loja

Sintomas
Não conecta / loading infinito, Input lag, Travamento
Fatores
Paralisação
Quem é afetado
Só um recurso específico, Servidor inteiro
Quando
Quando junta muita gente, Logo após login ou manutenção
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Pôr timeout nas chamadas lentas, separar pools de threads por recurso, tornar as chamadas assíncronas.
No gráfico
Achata ao bater no limite · Threads e tamanho da fila do pool de threads, tempo de processamento dos pedidos
Onde olhar
No .NET, ver o número de threads e o tamanho da fila do pool de threads no dotnet-counters monitor (dotnet.thread_pool.thread.count e dotnet.thread_pool.queue.length a partir do .NET 9, ThreadPool Thread Count e ThreadPool Queue Length até o 8) e conferir com dotnet-stack onde as worker threads estão esperando. Em servidores JVM ou nativos, conferir o mesmo com thread dumps
Confirma se
O uso de CPU fica bem abaixo de 100%, mas o número de threads sobe devagar sem parar ou fica colado no teto, a fila acumula e a maioria dos workers espera a resposta da mesma chamada externa (BD, HTTP)
Descarta se
Fila vazia e mesmo assim lento: o próprio destino das chamadas está lento, então aponta para falha em cascata ou dependência de serviços externos
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
Se o recebimento de pacotes e a lógica do jogo dividem o mesmo pool de worker threads, basta algumas tarefas lentas ocuparem todos os workers para o processamento de pacotes do servidor inteiro parar.
Casos reais
Riot Games 2021: Queda de 5 horas no EUW do League of Legends: um BD auxiliar parou o servidor inteiro

Fontes

  1. Debug ThreadPool Starvation Microsoft
    Quando não sobra thread no pool e as tarefas novas esperam, a resposta fica lenta; a causa é código bloqueante que segura threads. No dotnet-counters, CPU bem abaixo de 100% com dotnet.thread_pool.thread.count subindo devagar sem parar é sinal de esgotamento (muitas vezes dotnet.thread_pool.queue.length também está alto); dotnet-stack mostra onde as threads esperam
  2. Avoiding insurmountable queue backlogs AWS
    Concorrência = taxa de chegada × latência (lei de Little). Com 100 pedidos por segundo, se a latência sobe de 100 ms para 10 s, as threads necessárias passam de 10 para 1.000 e o pool se esgota
  3. Bulkhead Pattern Microsoft Azure
    Com um pool de conexões e de threads separado para cada destino, a falha de um destino bloqueia só aquele pool
  4. .NET runtime metrics .NET
    dotnet.thread_pool.thread.count (threads do pool) e dotnet.thread_pool.queue.length (tarefas na fila) existem a partir do .NET 9
  5. Well-known EventCounters in .NET Microsoft
    ThreadPool Thread Count (threadpool-thread-count) e ThreadPool Queue Length (threadpool-queue-length) do .NET 8 e anteriores

Veja também

Mesma camada: L9 Processo do jogo no servidor

Mesmo sintoma (Não conecta / loading infinito) em outras camadas

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