DBAtlas · Veritabanı operasyon atlası

Ö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.

DBAtlas'ta aç →