• Stars
    star
    132
  • Rank 265,796 (Top 6 %)
  • Language
    C
  • License
    Other
  • Created about 8 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Sampling based statistics of wait events

Build Status PGXN version GitHub license

pg_wait_sampling – sampling based statistics of wait events

Introduction

PostgreSQL 9.6+ provides an information about current wait event of particular process. However, in order to gather descriptive statistics of server behavior user have to sample current wait event multiple times. pg_wait_sampling is an extension for collecting sampling statistics of wait events.

The module must be loaded by adding pg_wait_sampling to shared_preload_libraries in postgresql.conf, because it requires additional shared memory and launches background worker. This means that a server restart is needed to add or remove the module.

When pg_wait_sampling is enabled, it collects two kinds of statistics.

  • History of waits events. It's implemented as in-memory ring buffer where samples of each process wait events are written with given (configurable) period. Therefore, for each running process user can see some number of recent samples depending on history size (configurable). Assuming there is a client who periodically read this history and dump it somewhere, user can have continuous history.
  • Waits profile. It's implemented as in-memory hash table where count of samples are accumulated per each process and each wait event (and each query with pg_stat_statements). This hash table can be reset by user request. Assuming there is a client who periodically dumps profile and resets it, user can have statistics of intensivity of wait events among time.

In combination with pg_stat_statements this extension can also provide per query statistics.

pg_wait_sampling launches special background worker for gathering the statistics above.

Availability

pg_wait_sampling is implemented as an extension and not available in default PostgreSQL installation. It is available from github under the same license as PostgreSQL and supports PostgreSQL 9.6+.

Installation

Pre-built pg_wait_sampling packages are provided in official PostgreSQL repository: https://download.postgresql.org/pub/repos/

Manual build

pg_wait_sampling is PostgreSQL extension which requires PostgreSQL 9.6 or higher. Before build and install you should ensure following:

  • PostgreSQL version is 9.6 or higher.
  • You have development package of PostgreSQL installed or you built PostgreSQL from source.
  • Your PATH variable is configured so that pg_config command available, or set PG_CONFIG variable.

Typical installation procedure may look like this:

$ git clone https://github.com/postgrespro/pg_wait_sampling.git
$ cd pg_wait_sampling
$ make USE_PGXS=1
$ sudo make USE_PGXS=1 install
$ make USE_PGXS=1 installcheck
$ psql DB -c "CREATE EXTENSION pg_wait_sampling;"

Compilation on Windows is not supported, since the extension uses symbols from PostgreSQL that are not exported.

Usage

pg_wait_sampling interacts with user by set of views and functions.

pg_wait_sampling_current view – information about current wait events for all processed including background workers.

Column name Column type Description
pid int4 Id of process
event_type text Name of wait event type
event text Name of wait event
queryid int8 Id of query

pg_wait_sampling_get_current(pid int4) returns the same table for single given process.

pg_wait_sampling_history view – history of wait events obtained by sampling into in-memory ring buffer.

Column name Column type Description
pid int4 Id of process
ts timestamptz Sample timestamp
event_type text Name of wait event type
event text Name of wait event
queryid int8 Id of query

pg_wait_sampling_profile view – profile of wait events obtained by sampling into in-memory hash table.

Column name Column type Description
pid int4 Id of process
event_type text Name of wait event type
event text Name of wait event
queryid int8 Id of query
count text Count of samples

pg_wait_sampling_reset_profile() function resets the profile.

The work of wait event statistics collector worker is controlled by following GUCs.

Parameter name Data type Description Default value
pg_wait_sampling.history_size int4 Size of history in-memory ring buffer 5000
pg_wait_sampling.history_period int4 Period for history sampling in milliseconds 10
pg_wait_sampling.profile_period int4 Period for profile sampling in milliseconds 10
pg_wait_sampling.profile_pid bool Whether profile should be per pid true
pg_wait_sampling.profile_queries bool Whether profile should be per query true

If pg_wait_sampling.profile_pid is set to false, sampling profile wouldn't be collected in per-process manner. In this case the value of pid could would be always zero and corresponding row contain samples among all the processes.

While pg_wait_sampling.profile_queries is set to false queryid field in views will be zero.

These GUCs are allowed to be changed by superuser. Also, they are placed into shared memory. Thus, they could be changed from any backend and affects worker runtime.

See PostgreSQL documentation for list of possible wait events.

Contribution

Please, notice, that pg_wait_sampling is still under development and while it's stable and tested, it may contains some bugs. Don't hesitate to raise issues at github with your bug reports.

If you're lacking of some functionality in pg_wait_sampling and feeling power to implement it then you're welcome to make pull requests.

Releases

New features are developed in feature-branches and then merged into master. To make a new release:

  1. Bump PGXN version in the META.json.
  2. Merge master into stable.
  3. Tag new release in the stable with git tag -a v1.1.X, where the last digit is used for indicating compatible shared library changes and bugfixes. Second digit is used to indicate extension schema change, i.e. when ALTER EXTENSION pg_wait_sampling UPDATE; is required.
  4. Merge stable into debian. This separate branch is used to independently support Debian packaging and @anayrat with @df7cb have an access there.

Authors

More Repositories

1

rum

RUM access method - inverted index with additional information in posting lists
C
694
star
2

jsquery

JsQuery – json query language with GIN indexing support
C
693
star
3

pg_probackup

Backup and recovery manager for PostgreSQL
Python
669
star
4

pg_pathman

Partitioning tool for PostgreSQL
C
571
star
5

zson

ZSON is a PostgreSQL extension for transparent JSONB compression
C
525
star
6

aqo

Adaptive query optimization for PostgreSQL
C
412
star
7

imgsmlr

Similar images search for PostgreSQL
C
251
star
8

mamonsu

Python
183
star
9

vops

C
162
star
10

postgres_cluster

Various experiments with PostgreSQL clustering
C
151
star
11

pg_query_state

Tool for query progress monitoring in PostgreSQL
C
144
star
12

testgres

Testing framework for PostgreSQL and its extensions
Python
125
star
13

sr_plan

Save and restore query plans in PostgreSQL
C
61
star
14

hunspell_dicts

Hunspell dictionaries for PostgreSQL
TSQL
60
star
15

pg_credereum

Prototype of PostgreSQL extension bringing some properties of blockchain to the relational DBMS
C
60
star
16

mmts

multimaster
C
58
star
17

raft

Raft protocol implementation in C
C
47
star
18

ptrack

Block-level incremental backup engine for PostgreSQL
C
43
star
19

pg_trgm_pro

C
42
star
20

sqljson

C
37
star
21

postgresql.pthreads

Port of postgresql for pthreads
C
29
star
22

postgresql.builtin_pool

Version of PostgreSQL with built-in connection pooling
C
29
star
23

pg_dtm

Distributed transaction manager
C
26
star
24

postgrespro

Postgres Professional fork of PostgreSQL
C
26
star
25

lsm3

LSM tree implementation based on standard B-Tree
C
25
star
26

lsm

RocksDB FDW for PostgreSQL
C
23
star
27

tsvector2

Extended tsvector type for PostgreSQL
C
19
star
28

pgwininstall

PostgreSQL Windows installer
Roff
19
star
29

pg_backtrace

Show backtrace for errors and signals
C
19
star
30

pg_tsparser

pg_tsparser - parser for text search
C
16
star
31

pg_ycsb

YCSB-like benchmark for pgbench
PLpgSQL
16
star
32

monq

MonQ - PostgreSQL extension for MongoDB-like queries to jsonb data
C
16
star
33

hstore_ops

Better operator class for hstore: smaller index and faster @> queries.
C
15
star
34

pg_logging

PostgreSQL logging interface
C
15
star
35

undam

Undo storage implementation
C
14
star
36

pgsphere

PgSphere provides spherical data types, functions, operators, and indexing for PostgreSQL.
C
13
star
37

tsexample

Example of custom postgresql full text search parser, dictionaries and configuration
C
13
star
38

pg_oltp_bench

Extension and scripts to run analogue of sysbench OLTP test using pgbench
PLpgSQL
13
star
39

libblobstamper

Framework for Structure Aware Fuzzing. Allows to build own stamps that would convert pulp-data that came from fuzzer to data with structure you need
C++
13
star
40

pg_grab_statement

PostgreSQL extension for recoding workload of specific database
C
12
star
41

tsexact

PostgreSQL fulltext search addon
C
11
star
42

jsonbd

JSONB compression method for PostgreSQL
C
10
star
43

rusmorph

Russian morphological dictionary (rusmorph) for Postgres based on libmorph library: https://github.com/big-keva/libmorph
C++
10
star
44

pg_parallizator

C
9
star
45

memstat

C
9
star
46

plantuner

C
8
star
47

pg_pageprep

PostgreSQL extension which helps to prepare heap pages for migration to 64bit XID page format (PostgresPro Enterprise)
C
8
star
48

wildspeed

C
7
star
49

pgbouncer

C
6
star
50

pg_pathman_build

Prerequisites for pg_pathman building
Shell
5
star
51

bztree

C++
5
star
52

snapfs

Fast recoverry and snapshoting
C
4
star
53

pq2jdbc

Java
4
star
54

jsonb_schema

Store jsonb schema separately from data
C
4
star
55

postgrespro-os-templates

Packer templates for building minimal baseboxes
Shell
3
star
56

pg_hint_plan

C
2
star
57

snowball_ext

The Snowball dictionary template extension for PostgreSQL
C
2
star
58

pg_variables

Session wide variables for PostgreSQL
C
2
star
59

dict_regex

C
1
star
60

jsonb_plpython

PLpgSQL
1
star
61

pg-mark

Postgres benchmarking framework
R
1
star
62

anyarray

contrib package for working with 1-D arrays
C
1
star
63

libpq_compression

C
1
star