01. Single node performance overview (high-level)
Start here when performance is unclear or the app is slow right now. This dashboard gives you the fastest path to understanding what is happening at the node level.
When to use
- The app is slow or timing out — you need a quick assessment
- You want to check the overall health of a Postgres node
- You need to identify which area (queries, locks, IO, vacuum) to investigate next
Key panels
Sessions and activity
- Active Session History (ASH) — stacked area chart showing sessions by wait type over time. This is the single most useful panel for understanding what the database is doing.
- Sessions — breakdown of active, idle, and idle-in-transaction connections
- Non-idle Sessions — focused view on sessions that are actually doing work
Throughput
- TPS — transactions per second (commits and rollbacks)
- QPS (pg_stat_statements) — queries per second from
pg_stat_statements - Tuples operations per second — inserts, updates, deletes, fetches
Query performance
- Query total time — total query execution time per second
- Query time per call (latency) — average query latency
I/O
- blk_reads and blk_hits per second — buffer cache effectiveness
- blk_read_time and blk_write_time — time spent on disk I/O
- WAL bytes per second — write-ahead log generation rate
- temp_bytes written per second — temporary file usage (indicates queries spilling to disk)
Maintenance
- Locks by mode — current lock distribution
- Longest non-idle transaction age — transactions running longer than 1 minute
- Transaction ID freeze age — proximity to wraparound
- Background writer and checkpointer — checkpoint frequency and buffer management
- Vacuum timeline — recent vacuum activity
- DB logical size distribution — database size breakdown
What good looks like
- Active sessions are low and stable relative to available CPU cores
- Wait distribution is mostly CPU or Client (not sustained IO or Lock waits)
- Idle-in-transaction sessions are near zero
- No long-running transactions (> 1 minute in OLTP)
- WAL generation rate is stable
- Temp bytes are minimal or zero
What to investigate
| Signal | Next step |
|---|---|
| IO waits dominating ASH | Go to Wait event analysis |
| Lock waits visible | Go to Lock contention |
| High query latency or CPU | Go to Query performance (top-N) |
| Long-running transactions | Check for idle-in-transaction sessions, missing idle_in_transaction_session_timeout |
| High temp bytes | Queries need more work_mem or query plan optimization |
| Freeze age approaching limit | Autovacuum may need tuning — check Autovacuum and bloat |
Related Checkup checks
- A003 — Postgres settings (CLI)
- G001 — memory-related settings (CLI)
- K003 — top queries by total time (monitoring stack)
- N001 — wait events grouped by type and query (monitoring stack)