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.