DBAtlas · Veritabanı operasyon atlası

Yüksek IO bekleme / disk gecikmesi

Sistem disk IO'sunda bekliyor. Önce yükün okuma mı yazma mı ağırlıklı olduğunu ayırıp, oradan buffer cache yetersizliği, tam tablo taraması, checkpoint fırtınası, IOPS sınırı ya da geçici alana spill nedenlerine iniyoruz.

IO okuma mı yazma mı ağırlıklı?

Dosya IO istatistiklerine bakarak beklemenin okuma tarafında mı (veri diskten okunuyor) yoksa yazma tarafında mı (redo/checkpoint/veri yazımı) olduğunu belirle. Bu, ağacı ikiye ayırır.

SELECT function_name, small_read_reqs+large_read_reqs AS reads, small_write_reqs+large_write_reqs AS writes,
       small_read_megabytes+large_read_megabytes+small_write_megabytes+large_write_megabytes AS mb
FROM v$iostat_function ORDER BY mb DESC;
  • Ağırlıklı okuma IO
  • Ağırlıklı yazma IO

Okuma IO'su neden yüksek?

Fazla fiziksel okuma üç ana nedenden gelir: buffer cache çok küçük (working set RAM'e sığmıyor), sorgular tam tablo taraması yapıyor, ya da büyük sort/hash işlemleri geçici alana taşıyor.

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';
SELECT sql_id, disk_reads, executions FROM v$sql ORDER BY disk_reads DESC FETCH FIRST 10 ROWS ONLY;
  • Buffer cache düşük, working set sığmıyor
  • Sorgular tam tablo taraması yapıyor
  • Büyük sort/hash geçici alana taşıyor

Yazma IO'su neden yüksek?

Yazma tarafındaki darboğaz ya periyodik checkpoint/flush'ların diski kısa süreliğine boğmasından (checkpoint fırtınası) ya da depolamanın sürekli yükü karşılayacak IOPS/throughput'a sahip olmamasından kaynaklanır.

SELECT event, total_waits, ROUND(time_waited/100,1) AS sec
FROM v$system_event
WHERE event IN ('log file parallel write','db file parallel write','checkpoint completed')
ORDER BY time_waited DESC;
  • Ani checkpoint/flush dalgaları (checkpoint fırtınası)
  • Depolama sürekli yüke yetişemiyor (IOPS sınırı)

Kök neden: Yetersiz buffer cache

Sık erişilen veri kümesi (working set) buffer cache'e sığmadığından bloklar sürekli diskten yeniden okunuyor. İsabet oranı düşük, fiziksel okuma yüksek.

Kök neden: Tam tablo taraması

Sorgular uygun index olmadığı için büyük tabloları baştan sona tarıyor; bu, hem çok fiziksel okuma yaratır hem de cache'i faydasız bloklarla kirletir.

Kök neden: Sort/hash geçici alana taşıyor

Büyük sıralama, hash join veya group by işlemleri çalışma belleğine sığmayıp geçici alana (temp/tempdb) yazıyor; bu da yoğun okuma/yazma IO'su üretir.

Kök neden: Checkpoint fırtınası

Dirty page'ler uzun süre biriktirilip kısa aralıklarla topluca diske yazılıyor; bu ani yazma dalgaları IO'yu periyodik olarak boğuyor.

Kök neden: Yetersiz IOPS / throughput

Depolama, iş yükünün gerektirdiği okuma+yazma isteğini karşılayacak IOPS ya da bant genişliğine sahip değil; kuyruk derinliği ve gecikme sürekli yüksek.

DBAtlas'ta aç →