DBAtlas · Atlas de operaciones de bases de datos

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.

Abrir en DBAtlas →