Analizar de dónde viene la I/O con pg_stat_io (tipo de backend, objeto, contexto)
PostgreSQLExtensionesComando
SELECT backend_type,
object,
context,
reads,
pg_size_pretty(reads * op_bytes) AS read_size,
writes,
pg_size_pretty(writes * op_bytes) AS write_size,
extends,
hits,
round(100.0 * hits / NULLIF(hits + reads, 0), 1) AS hit_pct,
evictions,
reuses,
fsyncs,
round(read_time::numeric, 1) AS read_ms,
round(write_time::numeric, 1) AS write_ms
FROM pg_stat_io
WHERE coalesce(reads, 0) + coalesce(writes, 0) + coalesce(extends, 0) + coalesce(evictions, 0) > 0
ORDER BY coalesce(reads, 0) + coalesce(writes, 0) DESC;
-- Who writes? Ideally most writes come from the checkpointer and background writer
SELECT backend_type,
pg_size_pretty(sum(writes * op_bytes)) AS written,
round(100.0 * sum(writes) / NULLIF(sum(sum(writes)) OVER (), 0), 1) AS pct_of_writes,
sum(fsyncs) AS fsyncs
FROM pg_stat_io
WHERE object = 'relation' AND writes > 0
GROUP BY backend_type
ORDER BY sum(writes) DESC;Qué hace
Muestra las lecturas, escrituras, extends, evictions y fsyncs por tipo de backend (client backend, autovacuum, checkpointer...), objeto (relation/temp relation) y contexto (normal, vacuum, bulkread, bulkwrite); y de qué tipos de proceso vienen las escrituras.
Cuándo usarlo
Durante un cuello de botella de I/O, para saber si la carga viene de las consultas, de autovacuum o de los checkpoints, y para validar los ajustes de shared_buffers/bgwriter.
Precaución
pg_stat_io abarca todo el clúster y es acumulado desde el último reset; tome la diferencia entre dos muestras para ver el cambio (para restablecer: SELECT pg_stat_reset_shared('io');). read_time/write_time solo se rellenan con track_io_timing = on. reads también incluye las lecturas servidas desde la page cache del SO. Muchas escrituras o evictions de client backend significan que los backends escriben ellos mismos los buffers para liberar espacio; revise shared_buffers, bgwriter_lru_maxpages y los ajustes de checkpoint. Las filas con context = 'vacuum'/'bulkread' reflejan el uso de ring buffers; los reuses ahí son normales.