IO wait alto / latência de disco
O sistema está esperando IO de disco. Primeiro separamos se a carga é predominantemente de leitura ou de gravação e depois descemos até as causas: buffer cache insuficiente, full table scans, checkpoint storms, limites de IOPS ou spills para o espaço temporário.
O IO é predominantemente de leitura ou de gravação?
Use as estatísticas de IO de arquivos para determinar se a espera está do lado da leitura (dados sendo lidos do disco) ou do lado da gravação (redo/checkpoint/gravação de dados). Isso divide a árvore em duas.
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 IO de leitura
- Principalmente IO de gravação
Por que o IO de leitura está alto?
Leituras físicas excessivas vêm de três causas principais: o buffer cache é pequeno demais (o working set não cabe na RAM), as consultas fazem full table scans, ou grandes operações de sort/hash fazem spill para o espaço temporário.
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;- O buffer cache hit está baixo, o working set não cabe
- As consultas fazem full table scans
- Grandes sorts/hashes fazem spill para o espaço temporário
Por que o IO de gravação está alto?
Um gargalo no lado da gravação vem de checkpoints/flushes periódicos que saturam brevemente o disco (checkpoint storm) ou de um armazenamento sem IOPS/throughput suficientes para sustentar a 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;- Ondas repentinas de checkpoint/flush (checkpoint storm)
- O armazenamento não acompanha a carga sustentada (limite de IOPS)
Causa raiz: buffer cache insuficiente
O conjunto de dados acessado com frequência (working set) não cabe no buffer cache, então os blocos são relidos do disco constantemente. O hit ratio é baixo e as leituras físicas são altas.
Causa raiz: full table scans
As consultas varrem tabelas grandes de ponta a ponta porque não há índice adequado; isso causa muitas leituras físicas e ainda polui o cache com blocos inúteis.
Causa raiz: sorts/hashes fazendo spill para o espaço temporário
Grandes operações de sort, hash join ou group by não cabem na memória de trabalho e gravam no espaço temporário (temp/tempdb), gerando IO intenso de leitura/gravação.
Causa raiz: checkpoint storm
As páginas sujas se acumulam por muito tempo e são gravadas em disco em massa em intervalos curtos; essas ondas repentinas de gravação saturam o IO periodicamente.
Causa raiz: IOPS / throughput insuficientes
O armazenamento não tem IOPS ou largura de banda para atender às solicitações de leitura+gravação que a carga exige; a profundidade da fila e a latência ficam persistentemente altas.