SlideShare a Scribd company logo
@LukasFittl
Monitoring
PostgreSQL
At Scale
#pgconfasia
@LukasFittl
@LukasFittl
pganalyze
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
PostgresStatistics
Tables
@LukasFittl
1“Block”=8kB
(usually, check block_size to confirm)
@LukasFittl
Tuple ~ Row
@LukasFittl
StatisticsAreOftenCounters
* except when reset / overrun
Counts only go up*,

calculate diffs!
@LukasFittl
SchemaStatistics
@LukasFittl
pg_stat_user_tables
relname: name of the table
seq_scan: # of sequential scans
idx_scan: # of index scans
n_tup_(ins/del/upd): # of rows modified
n_live_tup: live rows
n_dead_tup: dead rows
last_(auto)vacuum: last VACUUM
last_(auto)analyze: last ANALYZE
…
@LukasFittl
SELECT relname, n_live_tup, seq_scan + idx_scan,
100 * idx_scan / (seq_scan + idx_scan)
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC
IndexHitRate
Target: >= 95% on large, active tables
@LukasFittl
pg_statio_user_tables
relname: name of the table
heap_blks_read: blocks from disk / OS cache
heap_blks_hit: blocks from buffer cache
idx_blks_read: index blks from disk
idx_blks_hit: index blks from buffer cache
…
@LukasFittl
SELECT sum(heap_blks_hit) /
nullif(sum(heap_blks_hit + heap_blks_read),0)
FROM pg_statio_user_tables
TableCacheHitRate
Target: >= 99%
@LukasFittl
QueryWorkload
@LukasFittl
pg_stat_activity
pid: process ID
backend_type: “client backend”
vs internal processes
state: idle/active/idle in transaction
state_change: time of state change
query: current/last running query
backend_start: process start time
xact_start: TX start time
query_start: query start time
wait_event: what backend is waiting
for (e.g. Lock, I/O, etc)
…
@LukasFittl
#ofConnectionsByState
SELECT state,
backend_type,
COUNT(*)
FROM pg_stat_activity

GROUP BY 1, 2
@LukasFittl
LongestRunningQuery
SELECT now() - query_start,
query
FROM pg_stat_activity

WHERE state = ‘active’
ORDER BY 1
LIMIT 1
@LukasFittl
AgeOfOldestTransaction
SELECT MAX(now() - xact_start)

FROM pg_stat_activity

WHERE state <> ‘idle’
@LukasFittl
pg_stat_activity
wait event monitoring
https://github.com/postgrespro/pg_wait_sampling
@LukasFittl
pg_stat_statements
@LukasFittl
1. Install postgresql contrib package (if not installed)
2. Enable in postgresql.conf

shared_preload_libraries = ‘pg_stat_statements’
3. Restart your database
4. Create the extension

CREATE EXTENSION pg_stat_statements;
Enablingpg_stat_statements
@LukasFittl
SELECT * FROM pg_stat_statements;
userid | 10
dbid | 1397527
query | SELECT * FROM x WHERE
calls | 5
total_time | 15.249
rows | 0
shared_blks_hit | 451
shared_blks_read | 41
shared_blks_dirtied | 26
shared_blks_written | 0
local_blks_hit | 0
pg_stat_statements
@LukasFittl
Supportedoncloudplatforms
@LukasFittl
queryid | 1720234670
query | SELECT * FROM x WHERE y = ?
calls | 5
total_time | 15.249
Query+No.ofCalls+AvgTime
@LukasFittl
shared_blks_hit | 2447215
shared_blks_read | 55335
Avg.SharedBufferHitRate
hit_rate = shared_blks_hit /
(shared_blks_hit + shared_blks_read)
97.78% Cache Hit Rate
@LukasFittl
blk_read_time | 14.594
blk_write_time | 465.661
Timespentreading/writingtodisk
track_io_timing = on
@LukasFittl
LockStatistics
pg_locks
pid: process ID
(JOIN to pg_stat_activity.pid!)
locktype: type of object being locked
mode: locking type (e.g. AccessExclusive)
granted: Lock Granted vs Being Waited For
…
@LukasFittl
LockStatistics
pg_locks
SELECT *
FROM pg_locks
WHERE NOT granted
@LukasFittl
LockStatistics
pg_locks
SELECT locktype,
mode,
COUNT(*)
FROM pg_locks
WHERE granted
GROUP BY 1, 2
@LukasFittl
autovacuum
@LukasFittl
autovacuum
=> SELECT pid, query FROM pg_stat_activity
WHERE query LIKE 'autovacuum: %';
10469 | autovacuum: VACUUM ANALYZE public.schema_columns
12848 | autovacuum: VACUUM public.replication_follower_stats
28626 | autovacuum: VACUUM public.schema_index_stats
| (to prevent wraparound)
(3 rows)
pg_stat_activity
@LukasFittl
autovacuum
pg_stat_activity
@LukasFittl
autovacuum
pg_stat_progress_vacuum
relid: OID of the table
phase: current VACUUM phase
heap_blks_total: Heap Blocks Total
heap_blks_scanned: Heap Blocks Scanned
heap_blks_vacuumed: Heap Blocks Vacuumed
…
@LukasFittl
autovacuum
pg_stat_progress_vacuum
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
“We had an outage yesterday at
10am - whathappened?”
@LukasFittl
Keeping Historic
Statistics Data
IsEssential
@LukasFittl
DIYMonitoringHack:
Save pg_stat_activity and
pg_stat_database
every 10 seconds
into a separate monitoring database
@LukasFittl
pg_stat_activity
- Number & State of Connections
- Oldest Query Still Running
- Oldest Transaction Still Open
- Blocked Queries
@LukasFittl
pg_stat_database
- Transactions Per Second
- Data Read Per Second
- Rows Updated/etc Per Second
- Deadlocks Per Second
- …
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
Ability to Drill Down
From “HighCPUUtilization”
To Specific Set of Queries
@LukasFittl
@LukasFittl
@LukasFittl
@LukasFittl
CPUUtilization
pg_stat_statements.total_runtime
@LukasFittl
I/OUtilization
pg_stat_statements.blk_read_time
pg_stat_statements.blk_write_time
@LukasFittl
CacheHitRatio%
pg_stat_statements.shared_blks_hit
pg_stat_statements.shared_blks_read
pg_stat_database.blks_hit
pg_stat_database.blks_read
@LukasFittl
TemporaryFilesWritten
pg_stat_statements.temp_blks_written
pg_stat_database.temp_bytes
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
LOG: duration: 4079.697 ms execute <unnamed>:
SELECT * FROM x WHERE y = $1 LIMIT $2
DETAIL: parameters: $1 = 'long string', $2 = ‘1'
SlowQueries
log_min_duration_statement
= 1000 ms
@LukasFittl
@LukasFittl
@LukasFittl
auto_explain
logs the query plan

for specific slow queries
@LukasFittl
@LukasFittl
@LukasFittl
log_lock_waits = on
LOG: process 20679 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 after 1000.115 ms
LOG: process 20678 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 after 1000.126 ms
LOG: process 15533 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.129 ms
LOG: process 20663 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.100 ms
LOG: process 15537 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.130 ms
LOG: process 15536 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.222 ms
LOG: process 20734 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.130 ms
LOG: process 15538 still waiting for ExclusiveLock on tuple (566,1) of relation 16421 1000.136 ms
LOG: process 15758 still waiting for ShareLock on transaction 250175899 after 1000.073 ms
LockWaits
@LukasFittl
Statistics That Matter
Two Tables To Remember
Breaking Down High-Level Statistics
Three Log Events Worth Knowing
Query Annotations
@LukasFittl
@LukasFittl
@LukasFittl
application: pganalyze
controller: graphql
action: graphql
line: /app/graphql/organization_type.rb …
graphql: getOrganizationDetails.logVolume24h
request_id: 44bd562e-0f53-453f-831f-498e61ab6db5
@LukasFittl
github.com/basecamp/marginalia
Automatic
QueryAnnotationsForRubyonRails
@LukasFittl
3Take-Aways
1. Collect Historic Metrics
2. Focus on Drill-Down To Query Level
3. Annotate Your Queries With
Their Origin
@LukasFittl
Monitor YourPostgres:
pganalyze.com



Scale Your Postgres:
citusdata.com
Thanks!

More Related Content

What's hot (19)

PDF
Flexible Indexing with Postgres
EDB
 
PDF
Cassandra data structures and algorithms
Duyhai Doan
 
PPTX
Postgresql Database Administration- Day4
PoguttuezhiniVP
 
DOCX
Checking clustering factor to detect row migration
Heribertus Bramundito
 
PDF
Python testing-frameworks overview
Jachym Cepicky
 
PDF
PostgreSQL High_Performance_Cheatsheet
Lucian Oprea
 
PPTX
Indexing and Query Optimizer (Aaron Staple)
MongoSF
 
PPTX
Silent Revolution by Max Voronoy (Senior Consultant, Engineering, Globallogic)
GlobalLogic Ukraine
 
PDF
Hive practice
AnkalaRao Chinthapalli
 
PDF
Monitoring with exometer at AdRoll
Brian Troutwine
 
PDF
Introduction to Cassandra & Data model
Duyhai Doan
 
PDF
PGDay UK 2016 -- Performace for queries with grouping
Alexey Bashtanov
 
PDF
InfluxDB IOx Tech Talks: Query Processing in InfluxDB IOx
InfluxData
 
PDF
PMED Undergraduate Workshop - R Tutorial for PMED Undegraduate Workshop - Xi...
The Statistical and Applied Mathematical Sciences Institute
 
PDF
ScriptLUA
Iakov Volfkovich
 
PDF
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
PPTX
mysql 高级优化之 理解索引使用
nigel889
 
PDF
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
PDF
Bruce Momjian - Inside PostgreSQL Shared Memory @ Postgres Open
PostgresOpen
 
Flexible Indexing with Postgres
EDB
 
Cassandra data structures and algorithms
Duyhai Doan
 
Postgresql Database Administration- Day4
PoguttuezhiniVP
 
Checking clustering factor to detect row migration
Heribertus Bramundito
 
Python testing-frameworks overview
Jachym Cepicky
 
PostgreSQL High_Performance_Cheatsheet
Lucian Oprea
 
Indexing and Query Optimizer (Aaron Staple)
MongoSF
 
Silent Revolution by Max Voronoy (Senior Consultant, Engineering, Globallogic)
GlobalLogic Ukraine
 
Hive practice
AnkalaRao Chinthapalli
 
Monitoring with exometer at AdRoll
Brian Troutwine
 
Introduction to Cassandra & Data model
Duyhai Doan
 
PGDay UK 2016 -- Performace for queries with grouping
Alexey Bashtanov
 
InfluxDB IOx Tech Talks: Query Processing in InfluxDB IOx
InfluxData
 
PMED Undergraduate Workshop - R Tutorial for PMED Undegraduate Workshop - Xi...
The Statistical and Applied Mathematical Sciences Institute
 
ScriptLUA
Iakov Volfkovich
 
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
mysql 高级优化之 理解索引使用
nigel889
 
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
Bruce Momjian - Inside PostgreSQL Shared Memory @ Postgres Open
PostgresOpen
 

Similar to Monitoring Postgres at Scale | PGConf.ASIA 2018 | Lukas Fittl (20)

PDF
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Citus Data
 
PDF
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
PDF
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
PDF
PGConf APAC 2018 - Monitoring PostgreSQL at Scale
PGConf APAC
 
PPTX
PostgreSQL Performance Problems: Monitoring and Alerting
Grant Fritchey
 
PDF
Optimizing your app by understanding your Postgres | RailsConf 2019 | Samay S...
Citus Data
 
PDF
Aplicações 10x a 100x mais rápida com o postgre sql
Fabio Telles Rodriguez
 
PDF
Webinar slides: An Introduction to Performance Monitoring for PostgreSQL
Severalnines
 
PDF
What's New in PostgreSQL 17? - Mydbops MyWebinar Edition 35
Mydbops
 
PPTX
Migrating To PostgreSQL
Grant Fritchey
 
PDF
Explain this!
Fabio Telles Rodriguez
 
PDF
Postgres performance for humans
Craig Kerstiens
 
PDF
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
PDF
Wait! What’s going on inside my database?
Jeremy Schneider
 
PDF
pg_proctab: Accessing System Stats in PostgreSQL
Command Prompt., Inc
 
PDF
Advanced Postgres Monitoring
Denish Patel
 
PPTX
Monitoring and scaling postgres at datadog
Seth Rosenblum
 
PDF
Troubleshooting PostgreSQL with pgCenter
Alexey Lesovsky
 
PDF
PostgreSQL on Solaris
Theo Schlossnagle
 
PDF
PostgreSQL on Solaris
Theo Schlossnagle
 
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Citus Data
 
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
PGConf APAC 2018 - Monitoring PostgreSQL at Scale
PGConf APAC
 
PostgreSQL Performance Problems: Monitoring and Alerting
Grant Fritchey
 
Optimizing your app by understanding your Postgres | RailsConf 2019 | Samay S...
Citus Data
 
Aplicações 10x a 100x mais rápida com o postgre sql
Fabio Telles Rodriguez
 
Webinar slides: An Introduction to Performance Monitoring for PostgreSQL
Severalnines
 
What's New in PostgreSQL 17? - Mydbops MyWebinar Edition 35
Mydbops
 
Migrating To PostgreSQL
Grant Fritchey
 
Explain this!
Fabio Telles Rodriguez
 
Postgres performance for humans
Craig Kerstiens
 
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Wait! What’s going on inside my database?
Jeremy Schneider
 
pg_proctab: Accessing System Stats in PostgreSQL
Command Prompt., Inc
 
Advanced Postgres Monitoring
Denish Patel
 
Monitoring and scaling postgres at datadog
Seth Rosenblum
 
Troubleshooting PostgreSQL with pgCenter
Alexey Lesovsky
 
PostgreSQL on Solaris
Theo Schlossnagle
 
PostgreSQL on Solaris
Theo Schlossnagle
 
Ad

More from Citus Data (20)

PDF
Architecting peta-byte-scale analytics by scaling out Postgres on Azure with ...
Citus Data
 
PDF
Data Modeling, Normalization, and De-Normalization | PostgresOpen 2019 | Dimi...
Citus Data
 
PDF
JSONB Tricks: Operators, Indexes, and When (Not) to Use It | PostgresOpen 201...
Citus Data
 
PDF
Tutorial: Implementing your first Postgres extension | PGConf EU 2019 | Burak...
Citus Data
 
PDF
Whats wrong with postgres | PGConf EU 2019 | Craig Kerstiens
Citus Data
 
PDF
When it all goes wrong | PGConf EU 2019 | Will Leinweber
Citus Data
 
PDF
Amazing SQL your ORM can (or can't) do | PGConf EU 2019 | Louise Grandjonc
Citus Data
 
PDF
What Microsoft is doing with Postgres & the Citus Data acquisition | PGConf E...
Citus Data
 
PDF
Deep Postgres Extensions in Rust | PGCon 2019 | Jeff Davis
Citus Data
 
PDF
Why Postgres Why This Database Why Now | SF Bay Area Postgres Meetup | Claire...
Citus Data
 
PDF
A story on Postgres index types | PostgresLondon 2019 | Louise Grandjonc
Citus Data
 
PDF
Why developers need marketing now more than ever | GlueCon 2019 | Claire Gior...
Citus Data
 
PDF
The Art of PostgreSQL | PostgreSQL Ukraine | Dimitri Fontaine
Citus Data
 
PDF
When it all goes wrong (with Postgres) | RailsConf 2019 | Will Leinweber
Citus Data
 
PDF
The Art of PostgreSQL | PostgreSQL Ukraine Meetup | Dimitri Fontaine
Citus Data
 
PDF
Using Postgres and Citus for Lightning Fast Analytics, also ft. Rollups | Liv...
Citus Data
 
PDF
How to write SQL queries | pgDay Paris 2019 | Dimitri Fontaine
Citus Data
 
PDF
When it all Goes Wrong |Nordic PGDay 2019 | Will Leinweber
Citus Data
 
PDF
Why PostgreSQL Why This Database Why Now | Nordic PGDay 2019 | Claire Giordano
Citus Data
 
PDF
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Citus Data
 
Architecting peta-byte-scale analytics by scaling out Postgres on Azure with ...
Citus Data
 
Data Modeling, Normalization, and De-Normalization | PostgresOpen 2019 | Dimi...
Citus Data
 
JSONB Tricks: Operators, Indexes, and When (Not) to Use It | PostgresOpen 201...
Citus Data
 
Tutorial: Implementing your first Postgres extension | PGConf EU 2019 | Burak...
Citus Data
 
Whats wrong with postgres | PGConf EU 2019 | Craig Kerstiens
Citus Data
 
When it all goes wrong | PGConf EU 2019 | Will Leinweber
Citus Data
 
Amazing SQL your ORM can (or can't) do | PGConf EU 2019 | Louise Grandjonc
Citus Data
 
What Microsoft is doing with Postgres & the Citus Data acquisition | PGConf E...
Citus Data
 
Deep Postgres Extensions in Rust | PGCon 2019 | Jeff Davis
Citus Data
 
Why Postgres Why This Database Why Now | SF Bay Area Postgres Meetup | Claire...
Citus Data
 
A story on Postgres index types | PostgresLondon 2019 | Louise Grandjonc
Citus Data
 
Why developers need marketing now more than ever | GlueCon 2019 | Claire Gior...
Citus Data
 
The Art of PostgreSQL | PostgreSQL Ukraine | Dimitri Fontaine
Citus Data
 
When it all goes wrong (with Postgres) | RailsConf 2019 | Will Leinweber
Citus Data
 
The Art of PostgreSQL | PostgreSQL Ukraine Meetup | Dimitri Fontaine
Citus Data
 
Using Postgres and Citus for Lightning Fast Analytics, also ft. Rollups | Liv...
Citus Data
 
How to write SQL queries | pgDay Paris 2019 | Dimitri Fontaine
Citus Data
 
When it all Goes Wrong |Nordic PGDay 2019 | Will Leinweber
Citus Data
 
Why PostgreSQL Why This Database Why Now | Nordic PGDay 2019 | Claire Giordano
Citus Data
 
Scaling Multi-Tenant Applications Using the Django ORM & Postgres | PyCaribbe...
Citus Data
 
Ad

Recently uploaded (20)

DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
Biography of Daniel Podor.pdf
Daniel Podor
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 

Monitoring Postgres at Scale | PGConf.ASIA 2018 | Lukas Fittl