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)
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
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
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)