DBAtlas · Atlas de operações de banco de dados

Cache hit ratio baixo (buffer/cache hit)

O cache hit ratio está baixo; os dados são lidos constantemente do disco (ou da origem). Determine se o problema está no buffer/shared cache do banco ou no cache do Redis/aplicação e, em seguida, meça e corrija.

Qual cache tem hit ratio baixo?

Meça o hit ratio e isole o problema: o buffer/shared cache do banco está baixo (muitas leituras físicas), ou o cache do Redis/aplicação está tendo muitos misses e evictions?

SELECT ROUND((1-(pr.value/(dbg.value+cg.value)))*100,2) AS buffer_hit_pct
FROM v$sysstat pr, v$sysstat dbg, v$sysstat cg
WHERE pr.name='physical reads' AND dbg.name='db block gets' AND cg.name='consistent gets';
  • O hit ratio do buffer/shared cache do banco está baixo
  • Muitos misses / evictions no cache do Redis/aplicação

Por que está lendo do disco: tamanho ou padrão de scan?

Há duas causas típicas para um buffer hit ratio baixo: os dados acessados com frequência (working set) não cabem na memória (cache pequeno demais), ou grandes full table scans poluem o cache com blocos de uso único e expulsam páginas úteis.

SELECT component, current_size/1024/1024 AS mb FROM v$sga_dynamic_components WHERE component LIKE '%buffer cache%';
SELECT sql_id, disk_reads, executions FROM v$sql ORDER BY disk_reads DESC FETCH FIRST 10 ROWS ONLY;
  • O working set não cabe na RAM (cache pequeno demais)
  • Full table scans poluem o cache

Por que os misses no Redis: eviction por maxmemory ou gerenciamento de TTL/chaves?

Se o hit ratio do Redis estiver baixo, ou a memória atingiu maxmemory e as chaves estão sendo removidas (eviction), ou o gerenciamento de TTL/o padrão de cache das chaves é fraco (chaves frias, baixa reutilização).

INFO memory
# used_memory, maxmemory, maxmemory_policy, evicted_keys
CONFIG GET maxmemory-policy
INFO keyspace
# Key count and expires (keys with TTL) ratio per db
  • maxmemory cheio, eviction alta
  • Padrão de TTL/chaves fraco (baixa reutilização)

Causa raiz: o cache é pequeno demais para o working set

Os dados acessados com frequência são maiores que o buffer/cache alocado, então são constantemente removidos e relidos do disco. O hit ratio é baixo e as leituras físicas são altas.

Causa raiz: o padrão de scan polui o cache

Grandes full table scans enchem o cache com blocos usados uma vez e descartados, expulsando as páginas quentes; isso reduz o hit ratio.

Causa raiz: eviction por maxmemory no Redis

A memória do Redis atingiu o limite de maxmemory; chaves antigas são removidas para abrir espaço para novas (evicted_keys continua subindo). Isso perde entradas ainda necessárias e reduz o hit ratio.

Causa raiz: padrão de TTL / cache fraco

Ou as chaves não recebem TTL algum, e a memória se enche de dados frios, ou o padrão de cache tem baixa reutilização, e a maioria dos requests acaba em miss.

Abrir no DBAtlas →