Auf dieser Seite wird beschrieben, wie Sie die Leistung Ihrer AlloyDB Omni-Datenbank mithilfe von PostgreSQL-Scripts zur Observabiliät überwachen.
Status verbundener Prozesse und Warteereignisse ansehen
Sie können den Status der Prozesse ermitteln, die mit Ihrer AlloyDB Omni-Instanz verbunden sind, sowie alle Backends, die auf Aktivitäten warten, indem Sie die Ansicht pg_stat_activity
abfragen.
SELECT
pid,
datname,
age(backend_xid) AS age_in_xids,
now() - xact_start AS xact_age,
now() - query_start AS query_age,
state,
wait_event_type,
wait_event,
query_id,
query
FROM
pg_stat_activity
WHERE
state != 'idle'
AND pid <> pg_backend_pid()
ORDER BY
4 DESC
LIMIT 10;
Größte Tabellen ansehen
Sie können die Größe Ihrer größten Tabellen ermitteln, indem Sie die Ansicht pg_stat_user_tables
abfragen.
SELECT
oid,
oid::regclass table_name,
pg_size_pretty(pg_relation_size(oid)),
relpages,
s.seq_scan,
s.idx_scan
FROM
pg_class,
pg_stat_user_tables s
WHERE
s.relid = oid
AND oid > 16383
AND relpages > 100
AND relkind = 'r'
ORDER BY
relpages DESC
LIMIT 20;
Top-sequenzielle Scans ansehen
Die Top-sequenziellen Scans können Sie durch Abfragen der Ansicht pg_stat_user_tables
aufrufen.
SELECT
relid,
relname,
seq_scan,
pg_size_pretty(pg_relation_size(relid))
FROM
pg_stat_user_tables
ORDER BY
seq_scan DESC
LIMIT 15;
Top-Indexscans ansehen
Die Top-Indexscans können Sie durch Abfragen der Ansicht pg_stat_user_tables
aufrufen.
SELECT
relid,
relid::regclass table_name,
idx_scan,
pg_size_pretty(pg_relation_size(relid))
FROM
pg_stat_user_tables
WHERE
idx_scan > 10
ORDER BY
idx_scan DESC
LIMIT 15;
Am längsten laufende Transaktionen ansehen
Sie können sich die am längsten laufenden Transaktionen ansehen, indem Sie die Ansicht pg_stat_activity
abfragen und das Alter der einzelnen Transaktionen prüfen.
SELECT
pid,
age(backend_xid) AS age_in_xids,
now() - xact_start AS xact_age,
now() - query_start AS query_age,
state,
query
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
2 DESC
LIMIT 10;
Fortschritt des Staubsaugens prüfen
Sie können den Fortschritt von Bereinigungsvorgängen prüfen, indem Sie die Ansicht pg_stat_progress_vacuum
abfragen und sie mit der Ansicht pg_stat_activity
mithilfe von Prozess-IDs zusammenführen.
SELECT
p.pid,
now() - a.xact_start AS duration,
coalesce(wait_event_type ||'.'|| wait_event, 'f') AS waiting,
CASE
WHEN a.query ~*'^autovacuum.*to prevent wraparound' THEN 'wraparound'
WHEN a.query ~*'^vacuum' THEN 'user'
ELSE
'regular'
END AS mode,
p.datname AS database,
p.relid::regclass AS table,
p.phase,
pg_size_pretty(p.heap_blks_total * current_setting('block_size')::int) AS table_size,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(p.heap_blks_scanned * current_setting('block_size')::int) AS scanned,
pg_size_pretty(p.heap_blks_vacuumed * current_setting('block_size')::int) AS vacuumed,
round(100.0 * p.heap_blks_scanned / p.heap_blks_total, 1) AS scanned_pct,
round(100.0 * p.heap_blks_vacuumed / p.heap_blks_total, 1) AS vacuumed_pct,
p.index_vacuum_count,
round(100.0 * p.num_dead_tuples / p.max_dead_tuples,1) AS dead_pct
FROM pg_stat_progress_vacuum p
JOIN pg_stat_activity a using (pid)
ORDER BY now() - a.xact_start DESC;
Asynchrone Abfragen ansehen
Wenn Sie sich asynchron ausgeführte Abfragen ansehen möchten, können Sie die Ansicht pg_stat_activity
abfragen und nach Abfragen filtern, die nicht der Hauptprozess sind.
SELECT
query,
leader_pid,
array_agg(pid) FILTER (WHERE leader_pid != pid) AS members
FROM
pg_stat_activity
WHERE
leader_pid IS NOT NULL
GROUP BY
query,
leader_pid;
SQL-Code für Blockierungssperre ansehen
Sie können blockierte Aktivitäten aufrufen, indem Sie die Ansicht pg_locks
abfragen und mit der Ansicht pg_stat_activity
zusammenführen.
SELECT blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocked_activity.wait_event AS blocked_wait_event,
blocking_activity.wait_event AS blocking_wait_event,
blocking_activity.query AS current_statement_in_blocking_process
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
Effektivität der Größe work_mem
und temp_buffers
ermitteln
Wenn Sie wissen möchten, ob Ihre work_mem
und temp_buffers
für Ihre Anforderungen die richtige Größe haben, können Sie die pg_stat_database
-Ansicht abfragen und die postgres.log
-Datei prüfen.
Führen Sie mit pg_stat_database
die folgende Abfrage aus. Wenn temp_files
oder temp_bytes
zwischen den Ausführungen zugenommen hat, ist wahrscheinlich eine Optimierung für work_mem
oder temp_buffers
erforderlich.
SELECT
datname,
temp_files,
temp_bytes
FROM
pg_stat_database;
Prüfen Sie nach der Ausführung in der Datei postgres.log
, ob temporäre Dateien verwendet wurden:
LOG: [fd.c:1772] temporary file: path "base/pgsql_tmp/pgsql_tmp4640.1", size 139264
Ziel ist es, die Erstellung temporärer Dateien zu minimieren, nicht vollständig zu verhindern. Das liegt daran, dass sowohl work_mem
als auch temp_buffers
ein Gleichgewicht zwischen dem verfügbaren Arbeitsspeicher auf dem Host und der Anzahl der Verbindungen darstellen, für die der Arbeitsspeicher benötigt wird. Um diese Parameter richtig festzulegen, müssen Sie jede einzelne Arbeitslast kennen.