ID da causa db-batch · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de banco de dados (Equipe de infraestrutura)
Rodar com o jogo no ar o cálculo de rankings, o envio de correio em massa ou a limpeza de dados antigos ocupa locks e disco.
Por quê Um job pesado roda com o jogo no ar → Efeito Locks em faixas amplas, disco e CPU ocupados → Na tela Falhas de troca e de salvamento em certos horários, carregamento lento
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)
Dividir em partes pequenas e processar aos poucos, fazer as agregações na réplica.
O que fazer (Equipe de infraestrutura)
Oferecer uma réplica para agregações, agendar os jobs em lote para horários tranquilos, monitorar lock escalation e esperas por gap lock.
No gráfico
Picos em intervalos regulares · Latência das queries do BD, esperas por lock
Onde olhar
Encontrar as queries longas que rodavam no horário do lag. No MySQL, ver o slow query log; no PostgreSQL, query_start e query no pg_stat_activity; comparar com as métricas de espera por lock do mesmo horário e com a agenda dos jobs em lote (cron, event scheduler do BD). No SQL Server, registrar o lock escalation com o evento estendido lock_escalation
Confirma se
Sempre no mesmo horário rodam UPDATE, DELETE ou queries de agregação em massa, e enquanto isso as esperas por lock e a utilização do disco sobem juntas
Descarta se
Nenhuma query longa nesse horário: checkpoint (db-checkpoint) ou backup do servidor (dk-backup)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
No SQL Server, quando um comando segura mais de cerca de 5.000 locks de linha, eles viram um lock de tabela (lock escalation). Nesse instante, todas as requisições que usam a mesma tabela param. No MySQL, com a configuração padrão, alterar por uma condição de faixa também põe lock nos intervalos entre as linhas (gap lock) e impede a inserção de linhas novas.
Fontes
Transaction Locking and Row Versioning GuideMicrosoft SQL Server Lock escalation quando um comando segura 5.000 locks ou mais em uma tabela (ou índice); registrado pelo evento estendido lock_escalation
InnoDB LockingMySQL No nível de isolamento padrão do InnoDB, REPEATABLE READ, buscas e varreduras usam next-key locks, e o gap lock impede inserir linhas novas naquele intervalo
The Slow Query LogMySQL Registra as queries que passam do long_query_time com o tempo de execução (Query_time), o tempo de lock (Lock_time) e o número de linhas lidas