DBAtlas · Atlas de operaciones de bases de datos

Alta espera de IO / latencia de disco

El sistema está esperando E/S de disco. Primero distinguimos si la carga es de lectura o de escritura intensiva y luego profundizamos en las causas: buffer cache insuficiente, full table scans, tormentas de checkpoint, límites de IOPS o desbordamientos al espacio temporal.

¿La E/S es de lectura intensiva o de escritura intensiva?

Use las estadísticas de E/S de archivos para determinar si la espera está en el lado de lectura (datos leídos del disco) o en el de escritura (escrituras de redo/checkpoint/datos). Esto divide el árbol en dos.

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;
  • Principalmente E/S de lectura
  • Principalmente E/S de escritura

¿Por qué es alta la E/S de lectura?

Las lecturas físicas excesivas provienen de tres causas principales: el buffer cache es demasiado pequeño (el working set no cabe en la RAM), las consultas hacen full table scans o grandes operaciones de ordenación/hash se desbordan al espacio temporal.

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;
  • El buffer cache hit es bajo, el working set no cabe
  • Las consultas hacen full table scans
  • Grandes ordenaciones/hashes se desbordan al espacio temporal

¿Por qué es alta la E/S de escritura?

Un cuello de botella en el lado de escritura proviene de checkpoints/flushes periódicos que saturan brevemente el disco (tormenta de checkpoint) o de un almacenamiento sin las IOPS/el throughput necesarios para sostener la carga.

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;
  • Oleadas repentinas de checkpoint/flush (tormenta de checkpoint)
  • El almacenamiento no aguanta la carga sostenida (límite de IOPS)

Causa raíz: buffer cache insuficiente

El conjunto de datos de acceso frecuente (working set) no cabe en el buffer cache, por lo que los bloques se releen constantemente desde el disco. La tasa de aciertos es baja y las lecturas físicas son altas.

Causa raíz: full table scans

Las consultas recorren tablas grandes de principio a fin porque no hay un índice adecuado; esto provoca muchas lecturas físicas y además contamina la caché con bloques inútiles.

Causa raíz: ordenaciones/hashes que se desbordan al espacio temporal

Las operaciones grandes de sort, hash join o group by no caben en la memoria de trabajo y escriben en el espacio temporal (temp/tempdb), generando una E/S intensa de lectura/escritura.

Causa raíz: tormenta de checkpoint

Las páginas sucias se acumulan durante mucho tiempo y se escriben en disco de forma masiva a intervalos cortos; estas oleadas repentinas de escritura saturan periódicamente la E/S.

Causa raíz: IOPS / throughput insuficientes

El almacenamiento carece de las IOPS o del ancho de banda para atender las solicitudes de lectura+escritura que requiere la carga; la profundidad de cola y la latencia son persistentemente altas.

Abrir en DBAtlas →