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

Guia do Lag em Jogos › L12 Banco de dados

Cache stampede Cache stampede / thundering herd

ID da causa db-cache-stampede · 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 →

Quando o cache de dados populares expira todo ao mesmo tempo, milhares de requisições caem de uma vez no BD.

Por quê Dados populares guardados no Redis ou similar expiram ao mesmo tempo → Efeito As requisições que tentam recriar os mesmos dados caem todas de uma vez no BD → Na tela Com o BD sobrecarregado, vários recursos ficam lentos ou param, um atrás do outro

Sintomas
Input lag, Travamento, Não conecta / loading infinito
Fatores
Paralisação, Latência
Quem é afetado
Servidor inteiro
Quando
Em intervalos regulares, Quando junta muita gente
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)
Espalhar aleatoriamente os horários de expiração, deixar só uma requisição atualizar enquanto as demais usam o valor antigo.
O que fazer (Equipe de infraestrutura)
Configurar réplica e failover automático para o cache não esvaziar por inteiro quando o Redis reinicia ou falha, verificar se o BD tem folga para aguentar mesmo com o cache vazio.
No gráfico
Picos em intervalos regulares · Taxa de acerto do cache, queries por segundo no BD
Onde olhar
Sobrepor às queries por segundo do BD os valores keyspace_hits e keyspace_misses (taxa de acerto), expired_keys e o reinício (uptime_in_seconds) do INFO do Redis, e contar quantas cópias da mesma query rodam ao mesmo tempo no BD nesse instante (SHOW PROCESSLIST no MySQL, pg_stat_activity no PostgreSQL)
Confirma se
No instante em que os cache misses disparam, as queries do BD disparam junto, e a maior parte das queries simultâneas é a mesma query lendo os mesmos dados. Coincide com o ciclo de expiração de uma chave popular ou com um reinício do Redis
Descarta se
Cache misses normais, mas só as queries do BD aumentam: avalanche de logins (db-login-storm) ou jobs em lote (db-batch)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
O mesmo acontece quando o Redis reinicia ou falha e o cache esvazia por inteiro. Quanto mais a arquitetura confia no cache e mantém o BD pequeno, maior o risco.

Fontes

  1. Scaling Memcache at Facebook (NSDI '13) USENIX
    Quando uma chave muito usada é invalidada, muitas leituras caem no BD (thundering herd); evitado com leases (só um cliente atualiza) e devolução do valor antigo; clusters com cache vazio são aquecidos à parte
  2. Optimal Probabilistic Cache Stampede Prevention VLDB Endowment
    Quando um item popular expira, várias requisições o recriam ao mesmo tempo (cache stampede); evitado atualizando de forma probabilística antes da expiração
  3. High availability with Redis Sentinel Redis
    Failover automático que promove uma réplica quando o servidor primário cai
  4. INFO Redis
    keyspace_hits e keyspace_misses (buscas de chave com sucesso e com falha), expired_keys (chaves expiradas), uptime_in_seconds (tempo desde a inicialização)
  5. SHOW PROCESSLIST Statement MySQL
    Comando em execução (Info) e tempo no estado atual (Time, em segundos) de cada sessão
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: query em execução (query) de cada sessão

Veja também

Mesma camada: L12 Banco de dados

Mesmo sintoma (Input lag) em outras camadas

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