Önbellek isabet oranı düşük (buffer/cache hit)
Önbellek isabet oranı düşük; veri sürekli diskten (veya kaynaktan) okunuyor. Sorunun DB buffer/shared cache tarafında mı yoksa Redis/uygulama önbelleği tarafında mı olduğunu belirleyip ölçüp çözüyoruz.
Hangi önbellek düşük isabet veriyor?
İsabet oranını ölç ve sorunu ayır: veritabanının buffer/shared cache'i mi düşük (fiziksel okuma yüksek), yoksa Redis/uygulama önbelleğinde mi çok kayıp ve eviction var?
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';- DB buffer/shared cache isabet oranı düşük
- Redis/uygulama önbelleğinde çok kayıp / eviction
Neden diskten okuyor: boyut mu, tarama deseni mi?
Düşük buffer isabetinin iki tipik nedeni var: sık erişilen veri kümesi (working set) belleğe sığmıyor (cache küçük), ya da büyük tam tablo taramaları cache'i tek seferlik bloklarla kirletip faydalı sayfaları dışarı atıyor.
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;- Working set RAM'e sığmıyor (cache küçük)
- Tam tablo taraması cache'i kirletiyor
Redis kaybı neden: maxmemory eviction mi, TTL/anahtar yönetimi mi?
Redis isabet oranı düşükse ya bellek maxmemory'ye dayanmış ve anahtarlar eviction ile atılıyor, ya da anahtarlarda TTL yönetimi/isabetli önbellekleme deseni zayıf (soğuk anahtarlar, düşük yeniden kullanım).
INFO memory
# used_memory, maxmemory, maxmemory_policy, evicted_keys
CONFIG GET maxmemory-policy
INFO keyspace
# db başına anahtar sayısı ve expires (TTL'li anahtar) oranı- maxmemory dolu, eviction yüksek
- TTL/anahtar deseni zayıf (düşük yeniden kullanım)
Kök neden: Önbellek working set için küçük
Sık erişilen veri, ayrılan buffer/cache'ten büyük olduğu için sürekli evict edilip diskten yeniden okunuyor. İsabet oranı düşük, fiziksel okuma yüksek.
Kök neden: Tarama deseni cache'i kirletiyor
Büyük tam tablo taramaları, bir kez kullanılıp atılacak blokları cache'e doldurup hot page'leri dışarı atıyor; bu da isabet oranını düşürüyor.
Kök neden: Redis maxmemory eviction
Redis belleği maxmemory sınırına dayanmış; yeni anahtarlar için eski anahtarlar evict ediliyor (evicted_keys artıyor). Bu, hâlâ ihtiyaç duyulan girdilerin kaybolmasına ve isabet düşüşüne yol açar.
Kök neden: Zayıf TTL / önbellekleme deseni
Anahtarlar ya hiç TTL almadığından bellek soğuk veriyle doluyor, ya da önbellek deseni yeniden kullanımı düşük olduğundan çoğu istek miss'e düşüyor.