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.