SlideShare a Scribd company logo
1 of 38
Download to read offline
pg proctab
Accessing System Stats in PostgreSQL


Mark Wong markwkm@postgresql.org
 Gabrielle Roth gorthx@gmail.com

      PGWest Seattle (JDCon) 2009


          Oct 16-18, 2009
Slides available on slideshare




   http://www.slideshare.net/markwkm
Soooo . . .




   You can query the PostgreSQL system catalog tables (e.g.
   pg stat activity, pg stat all tables,
   pg stat all indexes) to find out which queries are taking a long
   time, which indexes are being scanned an unreasonable number of
   times, etc.
Example:




  portal=# SELECT datname, procpid, usename, current_query
  FROM pg_stat_activity;
  datname | procpid | usename |                   current_query
  ---------+---------+----------+-------------------------------------------------
  portal |     5412 | markwkm | <IDLE>
  portal |     5437 | postgres | SELECT datname, procpid, usename, current_query
                               : FROM pg_stat_activity;
  (2 rows)
What if you want to know about the OS?




   pg proctab provides a collection of four C stored functions:
     ◮   pg cputime
     ◮   pg loadavg
     ◮   pg memusage
     ◮   pg proctab
What can do you with pg proctab?




    ◮   Query operating system process table
    ◮   Query operating system statistics
          ◮   Processor time
          ◮   Load averages
          ◮   Memory usage
    ◮   Without escaping out to a shell!
    ◮   ...plus generate reports about timeslices
pg cputime() Example




  SELECT *
  FROM pg_cputime();

    user | nice | system |       idle    | iowait
  --------+--------+--------+------------+--------
   681317 | 109924 | 395481 | 1466101128 | 462661
  (1 row)
pg cputime() Column Description




  From Linux kernel source code at
  Documentation/filesystems/proc.txt:
  user: normal processes executing in user mode
  nice: niced processes executing in user mode
  system: processes executing in kernel mode
  idle: processes twiddling thumbs
  iowait: waiting for I/O to complete
pg loadavg() Example




  SELECT *
  FROM pg_loadavg();

   load1 | load5 | load15 | last_pid
  -------+-------+--------+----------
    0.99 | 0.78 |    0.67 |    27719
  (1 row)
pg loadavg() Column Description




  load1: load average of last minute
  load5: load average of last 5 minutes
  load15: load average of last 15 minutes
  last pid: last pid running
pg memusage() Example




  SELECT *
  FROM pg_memusage();

   memused | memfree | memshared | membuffers | memcached | swapused | swapfree | swapcached
  ---------+---------+-----------+------------+-----------+----------+----------+------------
   3809140 | 224084 |          0 |      60656 |   2389700 |       76 | 8385844 |           0
  (1 row)
pg memusage() Column Description


  Paraphrased from Linux kernel source code at
  Documentation/filesystems/proc.txt:
  memused: Total physical RAM used
  memfree: Total physical RAM not used
  memshared: Not used, always 0. (I don’t remember why. . . )
  membuffers: Temporary storage for raw disk blocks
  memcached: In-memory cache for files read from disk
  swapused: Total swap space used
  swapfree: Memory evicted from RAM that is now temporary on
  disk
  swapcached: Memory that was swapped out, now swapped in but
  still in swap
pg proctab() Example 1




  SELECT datname, procpid, usesysid, usename, uid, username
  FROM pg_stat_activity, pg_proctab()
  WHERE procpid = pid;

   datname | procpid | usesysid | usename | uid | username
  ---------+---------+----------+----------+-----+----------
   markwkm |   27801 |       10 | markwkm | 500 | markwkm
   dbt3    |   27787 |    16770 | postgres | 500 | markwkm
  (2 rows)
pg proctab() Example 2



  SELECT datname, procpid, processor, state, fullcomm
  FROM pg_stat_activity, pg_proctab()
  WHERE procpid = pid;

   datname | procpid | processor | state |                 fullcomm
  ---------+---------+-----------+-------+------------------------------------------
   markwkm |   27801 |         0 | R     | postgres: markwkm markwkm [local] SELECT
   dbt3    |   29325 |         3 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29327 |         0 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29333 |         3 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29328 |         2 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29329 |         0 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29324 |         3 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   29331 |         0 | R     | postgres: markwkm dbt3 [local] SELECT
   dbt3    |   27787 |         1 | S     | postgres: postgres dbt3 [local] idle
  (9 rows)
pg proctab() Partial Column Description

   Everything from the operating system such as /proc/<pid>/stat,
   /proc/<pid>/io and /proc/<pid>/cmdline as well as data
   from PostgreSQL system catalog such as pg stat activity table
   are available but we’ll only cover some of the fields here:
   Informative:
     ◮   pid
     ◮   comm - filename of the executable
     ◮   fullcomm (/proc/<pid>/cmdline)
     ◮   uid
     ◮   username
   Processor:
     ◮   utime - user mode jiffies
     ◮   stime - kernel mode jiffies
   ...
pg proctab() Partial Column Description (cont.)

   Memory:
     ◮    vsize - virtual memory size
     ◮    rss - resident set memory size
   I/O:
     ◮    syscr - number of read I/O operations
     ◮    syscw - number of write I/O operations
     ◮    reads - number of bytes which this process really did cause to
          be fetched from the storage layer
     ◮    writes - number of bytes which this process really did cause to
          be sent from the storage layer
     ◮    cwrites - number of bytes which this process caused to not
          happen, by truncating pagecache
__      __     /                    
         / ~~~/  . o O | Let’s try something |
   ,----(      oo    )   | more useful.         |
  /      __      __/                        /
 /|          ( |(
^    /___ / |
   |__|   |__|-"
__      __     /                      
         / ~~~/  . o O | Measuring performance |
   ,----(      oo    )   | of a query.            |
  /      __      __/                          /
 /|          ( |(
^    /___ / |
   |__|   |__|-"
(You can find the following examples in the pg proctab contrib
directory.)
Create snapshot tables.




   (Only need to do this once.)

   i create-ps_procstat-tables.sql
Identify yourself.




   SELECT *
   FROM pg_backend_pid();

    pg_backend_pid
   ----------------
             4590
   (1 row)
Take a snapshot before running the query



   i ps_procstat-snap.sql

   BEGIN

    ps_snap_stats
   ---------------
                1
   (1 row)

   COMMIT
Execute the query

   Don’t focus too much on the actual query, the idea is that is you
   want to collect statistics for a single query:
   SELECT   nation,
            o_year,
            Sum(amount) AS sum_profit
   FROM     (SELECT n_name                                                          AS nation,
                    Extract(YEAR FROM o_orderdate)                                  AS o_year,
                    l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount
             FROM   part,
                    supplier,
                    lineitem,
                    partsupp,
                    orders,
                    nation
             WHERE s_suppkey = l_suppkey
             AND ps_suppkey = l_suppkey
             AND ps_partkey = l_partkey
             AND p_partkey = l_partkey
             AND o_orderkey = l_orderkey
             AND s_nationkey = n_nationkey
             AND p_name LIKE ’%white%’) AS profit
   GROUP BY nation,
            o_year
   ORDER BY nation,
            o_year DESC;
Take a snapshot after running the query



   i ps_procstat-snap.sql

   BEGIN

    ps_snap_stats
   ---------------
                2
   (1 row)

   COMMIT
Calculate Processor Utilization

   $ ./ps-processor-utilization.sh [pid] [before] [after]


   $ ./ps-processor-utilization.sh 4590 1 2
   Processor Utilization = 1.00 %


   What’s going on (partially):
   SELECT stime, utime, stime + utime AS total,
          extract(epoch FROM time)
   FROM ps_snaps a, ps_procstat b
   WHERE pid = ${PID}
     AND a.snap = b.snap
     AND a.snap = ${SNAP1}

   TIMEDIFF=‘echo "scale = 2; (${TIME2} - ${TIME1}) * ${HZ}" | bc -l‘
   U=‘echo "scale = 2; (${TOTAL2} - ${TOTAL1}) / ${TIMEDIFF} * 100" | bc -l‘
Calculate Disk Utilization

   $ ./ps-io-utilization.sh 4590 1 2
   Reads = 276981
   Writes = 63803
   Reads (Bytes) = 2164604928
   Writes (Bytes) = 508166144
   Cancelled (Bytes) = 36880384

   SELECT syscr, syscw, reads, writes, cwrites
   FROM ps_snaps a, ps_procstat b
   WHERE pid = ${PID}
     AND a.snap = b.snap
     AND a.snap = ${SNAP1}


   TIMEDIFF=‘echo "scale = 2; (${TIME2} - ${TIME1}) * ${HZ}" | bc -l‘
   U=‘echo "scale = 2; (${TOTAL2} - ${TOTAL1}) / ${TIMEDIFF} * 100" | bc -l‘
__      __     /                
         / ~~~/  . o O | Creating Custom |
   ,----(      oo    )   | Reports!         |
  /      __      __/                    /
 /|          ( |(
^    /___ / |
   |__|   |__|-"
__      __     /                       
         / ~~~/  . o O | Warning! Too much data |
   ,----(      oo    )   | to fit on screen!       |
  /      __      __/                           /
 /|          ( |(
^    /___ / |
   |__|   |__|-"
Creating Reports: Section 1


   Database       : dbt3
   Snapshot Start : 2009-04-18 00:43:56.716034-07
   Snapshot End   : 2009-04-18 00:45:17.031167-07

   -------------------
   Database Statistics
   -------------------
   Commits     : 0
   Rollbacks   : 2
   Blocks Read : 213295
   Blocks Hit : 1679509
Creating Reports: Section 2
   ================
   Table Statistics
   ================
   ------------------------------------------ -------- ------------ -------- ------------- --------- --------
   Schema.Relation                            Seq Scan Seq Tup Read Idx Scan Idx Tup Fetch N Tup Ins N Tup Up
   ------------------------------------------ -------- ------------ -------- ------------- --------- --------
   information_schema.sql_features                   0            0        0             0         0
   information_schema.sql_implementation_info        0            0        0             0         0
   information_schema.sql_languages                  0            0        0             0         0
   information_schema.sql_packages                   0            0        0             0         0
   information_schema.sql_parts                      0            0        0             0         0
   information_schema.sql_sizing                     0            0        0             0         0
   information_schema.sql_sizing_profiles            0            0        0             0         0
   pg_catalog.pg_aggregate                           0            0        2             2         0
   pg_catalog.pg_am                                  1            1        0             0         0
   pg_catalog.pg_amop                                0            0       19            46         0
   pg_catalog.pg_amproc                              0            0       11            11         0
   pg_catalog.pg_attrdef                             0            0        1             2         0
   pg_catalog.pg_attribute                           0            0      137           331         0
   pg_catalog.pg_auth_members                        0            0        0             0         0
   pg_catalog.pg_authid                              3            2        0             0         0
   pg_catalog.pg_autovacuum                          0            0        0             0         0
   pg_catalog.pg_cast                                0            0      160            51         0
   pg_catalog.pg_class                               3          747      101            88         0
   pg_catalog.pg_constraint                          0            0        0             0         0
   pg_catalog.pg_conversion                          0            0        0             0         0
   pg_catalog.pg_database                            5           12        0             0         0
   pg_catalog.pg_depend                              0            0        0             0         0
   pg_catalog.pg_description                         0            0        0             0         0
   pg_catalog.pg_index                               2          200       39            50         0

   ...
Creating Reports: Section 2 - Falling off the right side...




     ◮   N Tup Upd
     ◮   N Tup Del
     ◮   Last Vacuum
     ◮   Last Autovacuum
     ◮   Last Analyze
     ◮   Last Autoanalyze
Creating Reports: Section 3
   ================
   Index Statistics
   ================
   ------------------------------------------------------------ -------- ------------ -------------
   Schema.Relation.Index                                        Idx Scan Idx Tup Read Idx Tup Fetch
   ------------------------------------------------------------ -------- ------------ -------------
   pg_catalog.pg_aggregate.pg_aggregate_fnoid_index                    2            2             2
   pg_catalog.pg_am.pg_am_name_index                                   0            0             0
   pg_catalog.pg_am.pg_am_oid_index                                    0            0             0
   pg_catalog.pg_amop.pg_amop_opc_strat_index                         12           36            36
   pg_catalog.pg_amop.pg_amop_opr_opc_index                            7           10            10
   pg_catalog.pg_amproc.pg_amproc_opc_proc_index                      11           11            11
   pg_catalog.pg_attrdef.pg_attrdef_adrelid_adnum_index                1            2             2
   pg_catalog.pg_attrdef.pg_attrdef_oid_index                          0            0             0
   pg_catalog.pg_attribute.pg_attribute_relid_attnam_index             0            0             0
   pg_catalog.pg_attribute.pg_attribute_relid_attnum_index           137          331           331
   pg_catalog.pg_auth_members.pg_auth_members_member_role_index        0            0             0
   pg_catalog.pg_auth_members.pg_auth_members_role_member_index        0            0             0
   pg_catalog.pg_authid.pg_authid_oid_index                            0            0             0
   pg_catalog.pg_authid.pg_authid_rolname_index                        0            0             0
   pg_catalog.pg_autovacuum.pg_autovacuum_vacrelid_index               0            0             0
   pg_catalog.pg_cast.pg_cast_oid_index                                0            0             0
   pg_catalog.pg_cast.pg_cast_source_target_index                    160           51            51
   pg_catalog.pg_class.pg_class_oid_index                             71           71            71
   pg_catalog.pg_class.pg_class_relname_nsp_index                     30           17            17
   pg_catalog.pg_constraint.pg_constraint_conname_nsp_index            0            0             0
   pg_catalog.pg_constraint.pg_constraint_conrelid_index               0            0             0
   pg_catalog.pg_constraint.pg_constraint_contypid_index               0            0             0
   pg_catalog.pg_constraint.pg_constraint_oid_index                    0            0             0
   pg_catalog.pg_conversion.pg_conversion_default_index                0            0             0

   ...
What else can we do with pg proctab?




   Enable pg top to monitor remote databases by providing access to
   the database system’s operating system process table.
pg top
__      __
         / ~~~/  . o O ( Thank you! )
   ,----(      oo    )
  /      __      __/
 /|          ( |(
^    /___ / |
   |__|   |__|-"
. . . the fine print . . .



      ◮   Linux-only
      ◮   Developed on 8.3; still works on 8.4
      ◮   Download it from:
          http://git.postgresql.org/gitweb?p=pg_proctab.git
      ◮   Change it:
          git clone
          git://git.postgresql.org/git/pg_proctab.git
      ◮   Patches welcome! We’ll be in the (Sn—H)ackers’ Lounge!
Acknowledgements



  Haley Jane Wakenshaw

            __      __
           / ~~~/ 
     ,----(      oo    )
    /      __      __/
   /|          ( |(
  ^    /___ / |
     |__|   |__|-"
License




   This work is licensed under a Creative Commons Attribution 3.0
   Unported License. To view a copy of this license, (a) visit
   http://creativecommons.org/licenses/by/3.0/us/; or, (b)
   send a letter to Creative Commons, 171 2nd Street, Suite 300, San
   Francisco, California, 94105, USA.

More Related Content

What's hot

PostgreSQL HA
PostgreSQL   HAPostgreSQL   HA
PostgreSQL HAharoonm
 
PostgreSQL Database Slides
PostgreSQL Database SlidesPostgreSQL Database Slides
PostgreSQL Database Slidesmetsarin
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and moreBrendan Gregg
 
PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs PGConf APAC
 
Physical Memory Management.pdf
Physical Memory Management.pdfPhysical Memory Management.pdf
Physical Memory Management.pdfAdrian Huang
 
Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer Sameer Kumar
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 
Patroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyPatroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyAlexander Kukushkin
 
Linux Profiling at Netflix
Linux Profiling at NetflixLinux Profiling at Netflix
Linux Profiling at NetflixBrendan Gregg
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresqlbotsplash.com
 
ClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howAltinity Ltd
 
Chasing the optimizer
Chasing the optimizerChasing the optimizer
Chasing the optimizerMauro Pagano
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Brendan Gregg
 
PostGreSQL Performance Tuning
PostGreSQL Performance TuningPostGreSQL Performance Tuning
PostGreSQL Performance TuningMaven Logix
 
What is new in PostgreSQL 14?
What is new in PostgreSQL 14?What is new in PostgreSQL 14?
What is new in PostgreSQL 14?Mydbops
 
Broken Linux Performance Tools 2016
Broken Linux Performance Tools 2016Broken Linux Performance Tools 2016
Broken Linux Performance Tools 2016Brendan Gregg
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingTanel Poder
 
Vacuum in PostgreSQL
Vacuum in PostgreSQLVacuum in PostgreSQL
Vacuum in PostgreSQLRafia Sabih
 

What's hot (20)

PostgreSQL HA
PostgreSQL   HAPostgreSQL   HA
PostgreSQL HA
 
PostgreSQL Database Slides
PostgreSQL Database SlidesPostgreSQL Database Slides
PostgreSQL Database Slides
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and more
 
PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs
 
Physical Memory Management.pdf
Physical Memory Management.pdfPhysical Memory Management.pdf
Physical Memory Management.pdf
 
Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer
 
The PostgreSQL Query Planner
The PostgreSQL Query PlannerThe PostgreSQL Query Planner
The PostgreSQL Query Planner
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
Patroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easyPatroni - HA PostgreSQL made easy
Patroni - HA PostgreSQL made easy
 
Linux Profiling at Netflix
Linux Profiling at NetflixLinux Profiling at Netflix
Linux Profiling at Netflix
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresql
 
ClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and how
 
PostgreSQL and RAM usage
PostgreSQL and RAM usagePostgreSQL and RAM usage
PostgreSQL and RAM usage
 
Chasing the optimizer
Chasing the optimizerChasing the optimizer
Chasing the optimizer
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)
 
PostGreSQL Performance Tuning
PostGreSQL Performance TuningPostGreSQL Performance Tuning
PostGreSQL Performance Tuning
 
What is new in PostgreSQL 14?
What is new in PostgreSQL 14?What is new in PostgreSQL 14?
What is new in PostgreSQL 14?
 
Broken Linux Performance Tools 2016
Broken Linux Performance Tools 2016Broken Linux Performance Tools 2016
Broken Linux Performance Tools 2016
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention Troubleshooting
 
Vacuum in PostgreSQL
Vacuum in PostgreSQLVacuum in PostgreSQL
Vacuum in PostgreSQL
 

Viewers also liked

PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...
PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...
PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...Command Prompt., Inc
 
Not Just UNIQUE: Generalized Index Constraints
Not Just UNIQUE: Generalized Index ConstraintsNot Just UNIQUE: Generalized Index Constraints
Not Just UNIQUE: Generalized Index ConstraintsCommand Prompt., Inc
 
Mastering PostgreSQL Administration
Mastering PostgreSQL AdministrationMastering PostgreSQL Administration
Mastering PostgreSQL AdministrationCommand Prompt., Inc
 
PostgreSQL High Availability via SLONY and PG POOL II
PostgreSQL High Availability via SLONY and PG POOL IIPostgreSQL High Availability via SLONY and PG POOL II
PostgreSQL High Availability via SLONY and PG POOL IICommand Prompt., Inc
 
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...Command Prompt., Inc
 
Implementing the Future of PostgreSQL Clustering with Tungsten
Implementing the Future of PostgreSQL Clustering with TungstenImplementing the Future of PostgreSQL Clustering with Tungsten
Implementing the Future of PostgreSQL Clustering with TungstenCommand Prompt., Inc
 
configuring a warm standby, the easy way
configuring a warm standby, the easy wayconfiguring a warm standby, the easy way
configuring a warm standby, the easy wayCommand Prompt., Inc
 
Replication using PostgreSQL Replicator
Replication using PostgreSQL ReplicatorReplication using PostgreSQL Replicator
Replication using PostgreSQL ReplicatorCommand Prompt., Inc
 
Python utilities for data presentation
Python utilities for data presentationPython utilities for data presentation
Python utilities for data presentationCommand Prompt., Inc
 
Elephant Roads: a tour of Postgres forks
Elephant Roads: a tour of Postgres forksElephant Roads: a tour of Postgres forks
Elephant Roads: a tour of Postgres forksCommand Prompt., Inc
 
Howdah - An Application using Pylons, PostgreSQL, Simpycity and Exceptable
Howdah - An Application using Pylons, PostgreSQL, Simpycity and ExceptableHowdah - An Application using Pylons, PostgreSQL, Simpycity and Exceptable
Howdah - An Application using Pylons, PostgreSQL, Simpycity and ExceptableCommand Prompt., Inc
 
PostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsPostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsCommand Prompt., Inc
 

Viewers also liked (20)

Bucardo
BucardoBucardo
Bucardo
 
PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...
PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...
PostgreSQL, Extensible to the Nth Degree: Functions, Languages, Types, Rules,...
 
Basic Query Tuning Primer
Basic Query Tuning PrimerBasic Query Tuning Primer
Basic Query Tuning Primer
 
Not Just UNIQUE: Generalized Index Constraints
Not Just UNIQUE: Generalized Index ConstraintsNot Just UNIQUE: Generalized Index Constraints
Not Just UNIQUE: Generalized Index Constraints
 
Mastering PostgreSQL Administration
Mastering PostgreSQL AdministrationMastering PostgreSQL Administration
Mastering PostgreSQL Administration
 
PostgreSQL High Availability via SLONY and PG POOL II
PostgreSQL High Availability via SLONY and PG POOL IIPostgreSQL High Availability via SLONY and PG POOL II
PostgreSQL High Availability via SLONY and PG POOL II
 
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...
Building tungsten-clusters-with-postgre sql-hot-standby-and-streaming-replica...
 
Implementing the Future of PostgreSQL Clustering with Tungsten
Implementing the Future of PostgreSQL Clustering with TungstenImplementing the Future of PostgreSQL Clustering with Tungsten
Implementing the Future of PostgreSQL Clustering with Tungsten
 
Go replicator
Go replicatorGo replicator
Go replicator
 
Pg migrator
Pg migratorPg migrator
Pg migrator
 
configuring a warm standby, the easy way
configuring a warm standby, the easy wayconfiguring a warm standby, the easy way
configuring a warm standby, the easy way
 
Replication using PostgreSQL Replicator
Replication using PostgreSQL ReplicatorReplication using PostgreSQL Replicator
Replication using PostgreSQL Replicator
 
Backup and-recovery2
Backup and-recovery2Backup and-recovery2
Backup and-recovery2
 
Python utilities for data presentation
Python utilities for data presentationPython utilities for data presentation
Python utilities for data presentation
 
A Practical Multi-Tenant Cluster
A Practical Multi-Tenant ClusterA Practical Multi-Tenant Cluster
A Practical Multi-Tenant Cluster
 
Temporal Data
Temporal DataTemporal Data
Temporal Data
 
Elephant Roads: a tour of Postgres forks
Elephant Roads: a tour of Postgres forksElephant Roads: a tour of Postgres forks
Elephant Roads: a tour of Postgres forks
 
Howdah - An Application using Pylons, PostgreSQL, Simpycity and Exceptable
Howdah - An Application using Pylons, PostgreSQL, Simpycity and ExceptableHowdah - An Application using Pylons, PostgreSQL, Simpycity and Exceptable
Howdah - An Application using Pylons, PostgreSQL, Simpycity and Exceptable
 
Introduction to triggers
Introduction to triggersIntroduction to triggers
Introduction to triggers
 
PostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsPostgreSQL Administration for System Administrators
PostgreSQL Administration for System Administrators
 

Similar to pg_proctab: Accessing System Stats in PostgreSQL

pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLMark Wong
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLCommand Prompt., Inc
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLMark Wong
 
What’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorWhat’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorMasahiko Sawada
 
Best Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesBest Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesOdoo
 
Linux Systems Performance 2016
Linux Systems Performance 2016Linux Systems Performance 2016
Linux Systems Performance 2016Brendan Gregg
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...Ontico
 
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak   CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak PROIDEA
 
計算機性能の限界点とその考え方
計算機性能の限界点とその考え方計算機性能の限界点とその考え方
計算機性能の限界点とその考え方Naoto MATSUMOTO
 
LISA2019 Linux Systems Performance
LISA2019 Linux Systems PerformanceLISA2019 Linux Systems Performance
LISA2019 Linux Systems PerformanceBrendan Gregg
 
Dbms plan - A swiss army knife for performance engineers
Dbms plan - A swiss army knife for performance engineersDbms plan - A swiss army knife for performance engineers
Dbms plan - A swiss army knife for performance engineersRiyaj Shamsudeen
 
Oracle Basics and Architecture
Oracle Basics and ArchitectureOracle Basics and Architecture
Oracle Basics and ArchitectureSidney Chen
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 HowtoPostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 HowtoMark Wong
 
Debugging Ruby Systems
Debugging Ruby SystemsDebugging Ruby Systems
Debugging Ruby SystemsEngine Yard
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityBrendan Gregg
 

Similar to pg_proctab: Accessing System Stats in PostgreSQL (20)

pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQLpg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
 
What’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorWhat’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributor
 
Best Practices in Handling Performance Issues
Best Practices in Handling Performance IssuesBest Practices in Handling Performance Issues
Best Practices in Handling Performance Issues
 
Explain this!
Explain this!Explain this!
Explain this!
 
Linux Systems Performance 2016
Linux Systems Performance 2016Linux Systems Performance 2016
Linux Systems Performance 2016
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...
Deep dive into PostgreSQL internal statistics / Алексей Лесовский (PostgreSQL...
 
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak   CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
 
計算機性能の限界点とその考え方
計算機性能の限界点とその考え方計算機性能の限界点とその考え方
計算機性能の限界点とその考え方
 
test
testtest
test
 
LISA2019 Linux Systems Performance
LISA2019 Linux Systems PerformanceLISA2019 Linux Systems Performance
LISA2019 Linux Systems Performance
 
Dbms plan - A swiss army knife for performance engineers
Dbms plan - A swiss army knife for performance engineersDbms plan - A swiss army knife for performance engineers
Dbms plan - A swiss army knife for performance engineers
 
Oracle Basics and Architecture
Oracle Basics and ArchitectureOracle Basics and Architecture
Oracle Basics and Architecture
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 HowtoPostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
 
Debugging Ruby Systems
Debugging Ruby SystemsDebugging Ruby Systems
Debugging Ruby Systems
 
Pro PostgreSQL
Pro PostgreSQLPro PostgreSQL
Pro PostgreSQL
 
Osol Pgsql
Osol PgsqlOsol Pgsql
Osol Pgsql
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
 

More from Command Prompt., Inc

More from Command Prompt., Inc (11)

5 Steps to PostgreSQL Performance
5 Steps to PostgreSQL Performance5 Steps to PostgreSQL Performance
5 Steps to PostgreSQL Performance
 
Normalization: A Workshop for Everybody Pt. 2
Normalization: A Workshop for Everybody Pt. 2Normalization: A Workshop for Everybody Pt. 2
Normalization: A Workshop for Everybody Pt. 2
 
Normalization: A Workshop for Everybody Pt. 1
Normalization: A Workshop for Everybody Pt. 1Normalization: A Workshop for Everybody Pt. 1
Normalization: A Workshop for Everybody Pt. 1
 
Integrating PostGIS in Web Applications
Integrating PostGIS in Web ApplicationsIntegrating PostGIS in Web Applications
Integrating PostGIS in Web Applications
 
Postgres for MySQL (and other database) people
Postgres for MySQL (and other database) peoplePostgres for MySQL (and other database) people
Postgres for MySQL (and other database) people
 
Building Grails applications with PostgreSQL
Building Grails applications with PostgreSQLBuilding Grails applications with PostgreSQL
Building Grails applications with PostgreSQL
 
Pg amqp
Pg amqpPg amqp
Pg amqp
 
Not Just UNIQUE: Exclusion Constraints
Not Just UNIQUE: Exclusion ConstraintsNot Just UNIQUE: Exclusion Constraints
Not Just UNIQUE: Exclusion Constraints
 
Database Hardware Benchmarking
Database Hardware BenchmarkingDatabase Hardware Benchmarking
Database Hardware Benchmarking
 
Vertically Challenged
Vertically ChallengedVertically Challenged
Vertically Challenged
 
Simpycity and Exceptable
Simpycity and ExceptableSimpycity and Exceptable
Simpycity and Exceptable
 

pg_proctab: Accessing System Stats in PostgreSQL

  • 1. pg proctab Accessing System Stats in PostgreSQL Mark Wong markwkm@postgresql.org Gabrielle Roth gorthx@gmail.com PGWest Seattle (JDCon) 2009 Oct 16-18, 2009
  • 2. Slides available on slideshare http://www.slideshare.net/markwkm
  • 3. Soooo . . . You can query the PostgreSQL system catalog tables (e.g. pg stat activity, pg stat all tables, pg stat all indexes) to find out which queries are taking a long time, which indexes are being scanned an unreasonable number of times, etc.
  • 4. Example: portal=# SELECT datname, procpid, usename, current_query FROM pg_stat_activity; datname | procpid | usename | current_query ---------+---------+----------+------------------------------------------------- portal | 5412 | markwkm | <IDLE> portal | 5437 | postgres | SELECT datname, procpid, usename, current_query : FROM pg_stat_activity; (2 rows)
  • 5. What if you want to know about the OS? pg proctab provides a collection of four C stored functions: ◮ pg cputime ◮ pg loadavg ◮ pg memusage ◮ pg proctab
  • 6. What can do you with pg proctab? ◮ Query operating system process table ◮ Query operating system statistics ◮ Processor time ◮ Load averages ◮ Memory usage ◮ Without escaping out to a shell! ◮ ...plus generate reports about timeslices
  • 7. pg cputime() Example SELECT * FROM pg_cputime(); user | nice | system | idle | iowait --------+--------+--------+------------+-------- 681317 | 109924 | 395481 | 1466101128 | 462661 (1 row)
  • 8. pg cputime() Column Description From Linux kernel source code at Documentation/filesystems/proc.txt: user: normal processes executing in user mode nice: niced processes executing in user mode system: processes executing in kernel mode idle: processes twiddling thumbs iowait: waiting for I/O to complete
  • 9. pg loadavg() Example SELECT * FROM pg_loadavg(); load1 | load5 | load15 | last_pid -------+-------+--------+---------- 0.99 | 0.78 | 0.67 | 27719 (1 row)
  • 10. pg loadavg() Column Description load1: load average of last minute load5: load average of last 5 minutes load15: load average of last 15 minutes last pid: last pid running
  • 11. pg memusage() Example SELECT * FROM pg_memusage(); memused | memfree | memshared | membuffers | memcached | swapused | swapfree | swapcached ---------+---------+-----------+------------+-----------+----------+----------+------------ 3809140 | 224084 | 0 | 60656 | 2389700 | 76 | 8385844 | 0 (1 row)
  • 12. pg memusage() Column Description Paraphrased from Linux kernel source code at Documentation/filesystems/proc.txt: memused: Total physical RAM used memfree: Total physical RAM not used memshared: Not used, always 0. (I don’t remember why. . . ) membuffers: Temporary storage for raw disk blocks memcached: In-memory cache for files read from disk swapused: Total swap space used swapfree: Memory evicted from RAM that is now temporary on disk swapcached: Memory that was swapped out, now swapped in but still in swap
  • 13. pg proctab() Example 1 SELECT datname, procpid, usesysid, usename, uid, username FROM pg_stat_activity, pg_proctab() WHERE procpid = pid; datname | procpid | usesysid | usename | uid | username ---------+---------+----------+----------+-----+---------- markwkm | 27801 | 10 | markwkm | 500 | markwkm dbt3 | 27787 | 16770 | postgres | 500 | markwkm (2 rows)
  • 14. pg proctab() Example 2 SELECT datname, procpid, processor, state, fullcomm FROM pg_stat_activity, pg_proctab() WHERE procpid = pid; datname | procpid | processor | state | fullcomm ---------+---------+-----------+-------+------------------------------------------ markwkm | 27801 | 0 | R | postgres: markwkm markwkm [local] SELECT dbt3 | 29325 | 3 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29327 | 0 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29333 | 3 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29328 | 2 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29329 | 0 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29324 | 3 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 29331 | 0 | R | postgres: markwkm dbt3 [local] SELECT dbt3 | 27787 | 1 | S | postgres: postgres dbt3 [local] idle (9 rows)
  • 15. pg proctab() Partial Column Description Everything from the operating system such as /proc/<pid>/stat, /proc/<pid>/io and /proc/<pid>/cmdline as well as data from PostgreSQL system catalog such as pg stat activity table are available but we’ll only cover some of the fields here: Informative: ◮ pid ◮ comm - filename of the executable ◮ fullcomm (/proc/<pid>/cmdline) ◮ uid ◮ username Processor: ◮ utime - user mode jiffies ◮ stime - kernel mode jiffies ...
  • 16. pg proctab() Partial Column Description (cont.) Memory: ◮ vsize - virtual memory size ◮ rss - resident set memory size I/O: ◮ syscr - number of read I/O operations ◮ syscw - number of write I/O operations ◮ reads - number of bytes which this process really did cause to be fetched from the storage layer ◮ writes - number of bytes which this process really did cause to be sent from the storage layer ◮ cwrites - number of bytes which this process caused to not happen, by truncating pagecache
  • 17. __ __ / / ~~~/ . o O | Let’s try something | ,----( oo ) | more useful. | / __ __/ / /| ( |( ^ /___ / | |__| |__|-"
  • 18. __ __ / / ~~~/ . o O | Measuring performance | ,----( oo ) | of a query. | / __ __/ / /| ( |( ^ /___ / | |__| |__|-"
  • 19. (You can find the following examples in the pg proctab contrib directory.)
  • 20. Create snapshot tables. (Only need to do this once.) i create-ps_procstat-tables.sql
  • 21. Identify yourself. SELECT * FROM pg_backend_pid(); pg_backend_pid ---------------- 4590 (1 row)
  • 22. Take a snapshot before running the query i ps_procstat-snap.sql BEGIN ps_snap_stats --------------- 1 (1 row) COMMIT
  • 23. Execute the query Don’t focus too much on the actual query, the idea is that is you want to collect statistics for a single query: SELECT nation, o_year, Sum(amount) AS sum_profit FROM (SELECT n_name AS nation, Extract(YEAR FROM o_orderdate) AS o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount FROM part, supplier, lineitem, partsupp, orders, nation WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey AND ps_partkey = l_partkey AND p_partkey = l_partkey AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey AND p_name LIKE ’%white%’) AS profit GROUP BY nation, o_year ORDER BY nation, o_year DESC;
  • 24. Take a snapshot after running the query i ps_procstat-snap.sql BEGIN ps_snap_stats --------------- 2 (1 row) COMMIT
  • 25. Calculate Processor Utilization $ ./ps-processor-utilization.sh [pid] [before] [after] $ ./ps-processor-utilization.sh 4590 1 2 Processor Utilization = 1.00 % What’s going on (partially): SELECT stime, utime, stime + utime AS total, extract(epoch FROM time) FROM ps_snaps a, ps_procstat b WHERE pid = ${PID} AND a.snap = b.snap AND a.snap = ${SNAP1} TIMEDIFF=‘echo "scale = 2; (${TIME2} - ${TIME1}) * ${HZ}" | bc -l‘ U=‘echo "scale = 2; (${TOTAL2} - ${TOTAL1}) / ${TIMEDIFF} * 100" | bc -l‘
  • 26. Calculate Disk Utilization $ ./ps-io-utilization.sh 4590 1 2 Reads = 276981 Writes = 63803 Reads (Bytes) = 2164604928 Writes (Bytes) = 508166144 Cancelled (Bytes) = 36880384 SELECT syscr, syscw, reads, writes, cwrites FROM ps_snaps a, ps_procstat b WHERE pid = ${PID} AND a.snap = b.snap AND a.snap = ${SNAP1} TIMEDIFF=‘echo "scale = 2; (${TIME2} - ${TIME1}) * ${HZ}" | bc -l‘ U=‘echo "scale = 2; (${TOTAL2} - ${TOTAL1}) / ${TIMEDIFF} * 100" | bc -l‘
  • 27. __ __ / / ~~~/ . o O | Creating Custom | ,----( oo ) | Reports! | / __ __/ / /| ( |( ^ /___ / | |__| |__|-"
  • 28. __ __ / / ~~~/ . o O | Warning! Too much data | ,----( oo ) | to fit on screen! | / __ __/ / /| ( |( ^ /___ / | |__| |__|-"
  • 29. Creating Reports: Section 1 Database : dbt3 Snapshot Start : 2009-04-18 00:43:56.716034-07 Snapshot End : 2009-04-18 00:45:17.031167-07 ------------------- Database Statistics ------------------- Commits : 0 Rollbacks : 2 Blocks Read : 213295 Blocks Hit : 1679509
  • 30. Creating Reports: Section 2 ================ Table Statistics ================ ------------------------------------------ -------- ------------ -------- ------------- --------- -------- Schema.Relation Seq Scan Seq Tup Read Idx Scan Idx Tup Fetch N Tup Ins N Tup Up ------------------------------------------ -------- ------------ -------- ------------- --------- -------- information_schema.sql_features 0 0 0 0 0 information_schema.sql_implementation_info 0 0 0 0 0 information_schema.sql_languages 0 0 0 0 0 information_schema.sql_packages 0 0 0 0 0 information_schema.sql_parts 0 0 0 0 0 information_schema.sql_sizing 0 0 0 0 0 information_schema.sql_sizing_profiles 0 0 0 0 0 pg_catalog.pg_aggregate 0 0 2 2 0 pg_catalog.pg_am 1 1 0 0 0 pg_catalog.pg_amop 0 0 19 46 0 pg_catalog.pg_amproc 0 0 11 11 0 pg_catalog.pg_attrdef 0 0 1 2 0 pg_catalog.pg_attribute 0 0 137 331 0 pg_catalog.pg_auth_members 0 0 0 0 0 pg_catalog.pg_authid 3 2 0 0 0 pg_catalog.pg_autovacuum 0 0 0 0 0 pg_catalog.pg_cast 0 0 160 51 0 pg_catalog.pg_class 3 747 101 88 0 pg_catalog.pg_constraint 0 0 0 0 0 pg_catalog.pg_conversion 0 0 0 0 0 pg_catalog.pg_database 5 12 0 0 0 pg_catalog.pg_depend 0 0 0 0 0 pg_catalog.pg_description 0 0 0 0 0 pg_catalog.pg_index 2 200 39 50 0 ...
  • 31. Creating Reports: Section 2 - Falling off the right side... ◮ N Tup Upd ◮ N Tup Del ◮ Last Vacuum ◮ Last Autovacuum ◮ Last Analyze ◮ Last Autoanalyze
  • 32. Creating Reports: Section 3 ================ Index Statistics ================ ------------------------------------------------------------ -------- ------------ ------------- Schema.Relation.Index Idx Scan Idx Tup Read Idx Tup Fetch ------------------------------------------------------------ -------- ------------ ------------- pg_catalog.pg_aggregate.pg_aggregate_fnoid_index 2 2 2 pg_catalog.pg_am.pg_am_name_index 0 0 0 pg_catalog.pg_am.pg_am_oid_index 0 0 0 pg_catalog.pg_amop.pg_amop_opc_strat_index 12 36 36 pg_catalog.pg_amop.pg_amop_opr_opc_index 7 10 10 pg_catalog.pg_amproc.pg_amproc_opc_proc_index 11 11 11 pg_catalog.pg_attrdef.pg_attrdef_adrelid_adnum_index 1 2 2 pg_catalog.pg_attrdef.pg_attrdef_oid_index 0 0 0 pg_catalog.pg_attribute.pg_attribute_relid_attnam_index 0 0 0 pg_catalog.pg_attribute.pg_attribute_relid_attnum_index 137 331 331 pg_catalog.pg_auth_members.pg_auth_members_member_role_index 0 0 0 pg_catalog.pg_auth_members.pg_auth_members_role_member_index 0 0 0 pg_catalog.pg_authid.pg_authid_oid_index 0 0 0 pg_catalog.pg_authid.pg_authid_rolname_index 0 0 0 pg_catalog.pg_autovacuum.pg_autovacuum_vacrelid_index 0 0 0 pg_catalog.pg_cast.pg_cast_oid_index 0 0 0 pg_catalog.pg_cast.pg_cast_source_target_index 160 51 51 pg_catalog.pg_class.pg_class_oid_index 71 71 71 pg_catalog.pg_class.pg_class_relname_nsp_index 30 17 17 pg_catalog.pg_constraint.pg_constraint_conname_nsp_index 0 0 0 pg_catalog.pg_constraint.pg_constraint_conrelid_index 0 0 0 pg_catalog.pg_constraint.pg_constraint_contypid_index 0 0 0 pg_catalog.pg_constraint.pg_constraint_oid_index 0 0 0 pg_catalog.pg_conversion.pg_conversion_default_index 0 0 0 ...
  • 33. What else can we do with pg proctab? Enable pg top to monitor remote databases by providing access to the database system’s operating system process table.
  • 35. __ __ / ~~~/ . o O ( Thank you! ) ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 36. . . . the fine print . . . ◮ Linux-only ◮ Developed on 8.3; still works on 8.4 ◮ Download it from: http://git.postgresql.org/gitweb?p=pg_proctab.git ◮ Change it: git clone git://git.postgresql.org/git/pg_proctab.git ◮ Patches welcome! We’ll be in the (Sn—H)ackers’ Lounge!
  • 37. Acknowledgements Haley Jane Wakenshaw __ __ / ~~~/ ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 38. License This work is licensed under a Creative Commons Attribution 3.0 Unported License. To view a copy of this license, (a) visit http://creativecommons.org/licenses/by/3.0/us/; or, (b) send a letter to Creative Commons, 171 2nd Street, Suite 300, San Francisco, California, 94105, USA.