DBAtlas · Atlas für Datenbankbetrieb

Mit pg_stat_io analysieren, woher I/O kommt (Backend-Typ, Objekt, Kontext)

PostgreSQLExtensions

Befehl

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;

Was es tut

Zeigt Reads, Writes, Extends, Evictions und Fsyncs nach Backend-Typ (client backend, autovacuum, checkpointer...), Objekt (relation/temp relation) und Kontext (normal, vacuum, bulkread, bulkwrite); und von welchen Prozesstypen die Schreibvorgänge stammen.

Wann einsetzen

Bei einem I/O-Engpass, um zu erkennen, ob die Last von Abfragen, Autovacuum oder Checkpoints kommt, und um Einstellungen von shared_buffers/bgwriter zu validieren.

Vorsicht

pg_stat_io gilt clusterweit und ist seit dem letzten Reset kumuliert; bilde die Differenz zweier Stichproben, um Veränderungen zu sehen (Reset: SELECT pg_stat_reset_shared('io');). read_time/write_time werden nur mit track_io_timing = on befüllt. reads enthält auch Lesevorgänge, die aus dem Page Cache des OS bedient werden. Hohe Writes oder Evictions durch client backend bedeuten, dass Backends Buffers selbst schreiben, um Platz zu schaffen; prüfe shared_buffers, bgwriter_lru_maxpages und die Checkpoint-Einstellungen. Zeilen mit context = 'vacuum'/'bulkread' spiegeln die Nutzung von Ring Buffers wider; reuses sind dort normal.

In DBAtlas öffnen →

Verwandte Einträge