DBAtlas · Atlas d'exploitation des bases de données

Analyser l'origine des E/S avec pg_stat_io (type de backend, objet, contexte)

PostgreSQLExtensions

Commande

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;

Ce que fait la commande

Affiche les lectures, écritures, extensions, évictions et fsyncs par type de backend (client backend, autovacuum, checkpointer...), objet (relation/relation temporaire) et contexte (normal, vacuum, bulkread, bulkwrite) ; et de quels types de processus proviennent les écritures.

Quand l'utiliser

Lors d'un goulet d'E/S, pour déterminer si la charge vient des requêtes, d'autovacuum ou des checkpoints, et pour valider les réglages shared_buffers/bgwriter.

Attention

pg_stat_io couvre tout le cluster et est cumulé depuis la dernière réinitialisation ; faites la différence entre deux échantillons pour voir l'évolution (pour réinitialiser : SELECT pg_stat_reset_shared('io');). read_time/write_time ne sont renseignés qu'avec track_io_timing = on. reads inclut aussi les lectures servies par le page cache de l'OS. Des écritures ou évictions élevées pour client backend signifient que les backends écrivent eux-mêmes les buffers pour libérer de la place ; revoyez shared_buffers, bgwriter_lru_maxpages et les réglages de checkpoint. Les lignes avec context = 'vacuum'/'bulkread' reflètent l'utilisation des ring buffers ; les reuses y sont normaux.

Ouvrir dans DBAtlas →

Voir aussi