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

Guia do Lag em Jogos › L12 Banco de dados

Avalanche de logins e queries N+1 Login storm, N+1 queries

ID da causa db-login-storm · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de banco de dados (Equipe de infraestrutura)

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

Se carregar um personagem exige dezenas de consultas separadas, dezenas de milhares de logins simultâneos viram milhões de queries.

Por quê Ao carregar um personagem, itens, skills e quests são consultados um a um, separadamente → Efeito Os logins simultâneos logo após a manutenção fazem as queries explodirem → Na tela Login em loading infinito, e até o salvamento de quem já está jogando fica na fila

Sintomas
Não conecta / loading infinito, Input lag
Fatores
Paralisação, Latência
Quem é afetado
Servidor inteiro
Quando
Logo após login ou manutenção
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de banco de dados (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Consultar tudo de uma vez em lote, usar fila de login e cache, verificar o número de consultas gerado pelo lazy loading do ORM.
O que fazer (Equipe de infraestrutura)
Levantar e compartilhar o ranking das queries mais chamadas, monitorar o número de queries e de conexões no horário de login logo após a manutenção.
No gráfico
Pico logo após abrir ou manutenção · Queries por segundo no BD, logins
Onde olhar
Sobrepor o número de logins logo após a manutenção às queries por segundo do BD (no MySQL, o aumento de Questions) e calcular quantas queries cada login gera. Levantar as queries mais chamadas pelo COUNT_STAR do events_statements_summary_by_digest no MySQL ou pelo calls do pg_stat_statements no PostgreSQL
Confirma se
Cada login gera dezenas de queries, e as mais chamadas são queries curtas de mesmo formato que consultam por um único ID de personagem. Se o número de queries por login aumentou depois de um patch, esse patch é o ponto de partida
Descarta se
Poucas queries por login, mas cada uma lenta: cache frio (db-cold-cache) ou índice (db-no-index)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
O lazy loading do ORM (biblioteca que monta as consultas ao BD no lugar do desenvolvedor) gera esse tipo de consulta sem que nem o desenvolvedor perceba. No servidor de desenvolvimento, com poucos personagens, nada aparece; o problema só surge com os logins simultâneos em produção.

Fontes

  1. Efficient Querying .NET
    O lazy loading do ORM cria o problema N+1, que envia uma query a mais para cada item e derruba muito o desempenho; recomenda-se carregar tudo de uma vez (eager loading)
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    Agrega o número de execuções (calls) e o tempo total de cada comando para levantar o ranking das queries mais chamadas
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest agrupa queries de mesmo formato e soma execuções e tempo
  4. Statement Summary Tables MySQL
    COUNT_STAR (número de execuções) e SUM_TIMER_WAIT (tempo total) das tabelas de resumo
  5. Server Status Variables MySQL
    Questions: número de comandos enviados pelos clientes

Veja também

Mesma camada: L12 Banco de dados

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

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