DBAtlas · Atlas d'exploitation des bases de données

Faible taux de succès du cache (buffer/cache hit)

Le taux de succès du cache est faible ; les données sont constamment lues sur disque (ou depuis la source). Déterminez si le problème se situe dans le buffer/cache partagé de la base ou dans le cache Redis/applicatif, puis mesurez et corrigez.

Quel cache a un faible taux de succès ?

Mesurez le taux de succès et isolez le problème : le buffer/cache partagé de la base est-il faible (fortes lectures physiques), ou le cache Redis/applicatif subit-il de nombreux misses et évictions ?

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';
  • Le taux de succès du buffer/cache partagé de la base est faible
  • Nombreux misses / évictions dans le cache Redis/applicatif

Pourquoi lit-il sur disque : taille ou schéma de parcours ?

Un faible taux de succès du buffer a deux causes typiques : les données fréquemment consultées (working set) ne tiennent pas en mémoire (cache trop petit), ou de grands parcours complets de tables polluent le cache avec des blocs à usage unique et en chassent les pages utiles.

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;
  • Le working set ne tient pas en RAM (cache trop petit)
  • Les parcours complets de tables polluent le cache

Pourquoi les misses Redis : éviction maxmemory ou gestion des TTL/clés ?

Si le taux de succès Redis est faible, soit la mémoire a atteint maxmemory et des clés sont évincées, soit la gestion des TTL/le schéma de mise en cache des clés est faible (clés froides, faible réutilisation).

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 plein, éviction élevée
  • Schéma TTL/clés faible (faible réutilisation)

Cause racine : le cache est trop petit pour le working set

Les données fréquemment consultées dépassent le buffer/cache alloué, elles sont donc constamment évincées et relues sur disque. Taux de succès faible, lectures physiques élevées.

Cause racine : le schéma de parcours pollue le cache

De grands parcours complets de tables remplissent le cache de blocs utilisés une fois puis abandonnés, chassant les pages chaudes ; cela fait baisser le taux de succès.

Cause racine : éviction maxmemory de Redis

La mémoire Redis a atteint la limite maxmemory ; d'anciennes clés sont évincées pour faire de la place aux nouvelles (evicted_keys ne cesse d'augmenter). Des entrées encore nécessaires sont ainsi perdues et le taux de succès baisse.

Cause racine : schéma de TTL / de mise en cache faible

Soit les clés n'ont aucun TTL et la mémoire se remplit de données froides, soit le schéma de mise en cache a une faible réutilisation et la plupart des requêtes finissent en misses.

Ouvrir dans DBAtlas →