Tasa de aciertos de caché baja (buffer/cache hit)
La tasa de aciertos de caché es baja; los datos se leen constantemente del disco (o del origen). Determine si el problema está en el buffer/caché compartida de la BD o en la caché de Redis/aplicación, y luego mídalo y corríjalo.
¿Qué caché tiene una tasa de aciertos baja?
Mida la tasa de aciertos y aísle el problema: ¿es baja la del buffer/caché compartida de la base de datos (muchas lecturas físicas), o la caché de Redis/aplicación registra muchos fallos y expulsiones?
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';- La tasa de aciertos del buffer/caché compartida de la BD es baja
- Muchos fallos / expulsiones en la caché de Redis/aplicación
¿Por qué lee del disco: tamaño o patrón de escaneo?
Hay dos causas típicas de una tasa de aciertos de buffer baja: los datos de acceso frecuente (working set) no caben en memoria (caché demasiado pequeña), o grandes full table scans contaminan la caché con bloques de un solo uso y expulsan las páginas útiles.
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;- El working set no cabe en la RAM (caché demasiado pequeña)
- Los full table scans contaminan la caché
¿Por qué los fallos en Redis: expulsión por maxmemory o gestión de TTL/claves?
Si la tasa de aciertos de Redis es baja, o bien la memoria ha alcanzado maxmemory y se están expulsando claves, o bien la gestión de TTL/el patrón de caché de las claves es deficiente (claves frías, poca reutilización).
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 lleno, alta expulsión
- Patrón de TTL/claves deficiente (poca reutilización)
Causa raíz: la caché es demasiado pequeña para el working set
Los datos de acceso frecuente son mayores que el buffer/caché asignado, por lo que se expulsan constantemente y se releen del disco. La tasa de aciertos es baja y las lecturas físicas son altas.
Causa raíz: el patrón de escaneo contamina la caché
Los grandes full table scans llenan la caché de bloques que se usan una vez y se descartan, expulsando las páginas calientes; esto reduce la tasa de aciertos.
Causa raíz: expulsión por maxmemory en Redis
La memoria de Redis ha alcanzado el límite maxmemory; se expulsan claves antiguas para hacer sitio a las nuevas (evicted_keys no deja de subir). Así se pierden entradas que aún se necesitan y baja la tasa de aciertos.
Causa raíz: patrón de TTL / caché deficiente
O bien las claves no reciben ningún TTL, de modo que la memoria se llena de datos fríos, o bien el patrón de caché tiene poca reutilización, por lo que la mayoría de las solicitudes acaban en fallos.