SlideShare a Scribd company logo
pg proctab
Accessing System Stats in PostgreSQL


           Mark Wong
      markwkm@postgresql.org

     PostgreSQL Conference East 2010


         March 25-28, 2010
Slides available on slideshare




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




     Brief review of what PostgreSQL stats are available
     How pg proctab may help
Review



  Some of the PostgreSQL system catalog tables:
         pg stat activity
         pg stat database
         pg stat all tables
         pg stat all indexes
         pg statio all tables
         pg statio all indexes
Example: pg stat activity


  SELECT datname, procpid, usename, current_query
  FROM pg_stat_activity
  WHERE current_query <> ’<IDLE>’;

  datname         dbt5
  procpid         3260
  usename         postgres
  current_query   SELECT * FROM TradeLookupFrame3(
                  ’2006-2-27 9:15:0’,43000050000,20,
                  ’2005-11-23 12:6:8’,’ENGAPRB’)


  ...
Example: pg stat database




  SELECT datname, numbackends, xact_commit, xact_rollback
  FROM pg_stat_database
  ORDER BY datname;

  datname         dbt5
  numbackends     11
  xact_commit     228458
  xact_rollback   320
Example: pg stat all tables



  SELECT seq_scan, idx_scan, n_tup_ins, n_tup_upd,
         n_tup_del
  FROM pg_stat_all_tables
  WHERE relname = ’customer’;

  seq_scan    10
  idx_scan    152795
  n_tup_ins   5000
  n_tup_upd   0
  n_tup_del   0
Example: pg statio all tables



  SELECT heap_blks_read, heap_blks_hit, idx_blks_read,
         idx_blks_hit
  FROM pg_statio_all_tables
  WHERE relname = ’customer’;

  heap_blks_read   26897
  heap_blks_hit    141581
  idx_blks_read    5577
  idx_blks_hit     328770
__      __
           / ~~~/  . o O ( Want more! )
    ,----(       oo     )
  /        __      __/
 /|            ( |(
^     /___ / |
    |__|    |__|-"
What about operating system statistics?




      I/O? — iostat
      Processor Utilization? — mpstat
      Per Process Statistics? — pidstat
      Other system activity? — sar
      and so on...
Introducing pg proctab




   pg proctab is a collection of four C stored functions:
       pg cputime
       pg loadavg
       pg memusage
       pg proctab
__      __
           / ~~~/  . o O ( Examples? )
    ,----(       oo     )
  /        __      __/
 /|            ( |(
^     /___ / |
    |__|    |__|-"
Some of the things pg proctab should help with




       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
   Note: Following examples are from Linux based systems.
pg cputime() Example




  SELECT *
  FROM pg_cputime();

  user     31529387
  nice     76
  system   6865679
  idle     574707718
  iowait   1985455
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      7.71
  load5      7.73
  load15     7.62
  last_pid   4623
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      32793836
  memfree      157704
  memshared    0
  membuffers   94216
  memcached    31749292
  swapused     13960
  swapfree     3986216
  swapcached   1264
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. (For Solaris.)
  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() 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 ( More useful examples? )
    ,----(       oo     )
  /        __      __/
 /|            ( |(
^     /___ / |
    |__|    |__|-"
pg proctab() Example

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

  datname     dbt5
  procpid     3260
  processor   6
  state       R
  fullcomm    postgres: postgres dbt5 207.173.203.228(48950)
              SELECT

  datname     dbt5
  procpid     3261
  processor   1
  state       R
  fullcomm    postgres: postgres dbt5 207.173.203.228(48953)
              SELECT
__      __     /                      
           / ~~~/  . o O | Measuring performance |
    ,----(       oo     )  | of a query.           |
  /        __      __/                          /
 /|            ( |(
^     /___ / |
    |__|    |__|-"


You can find the following helper scripts in the pg proctab
contrib directory.
Create snapshot tables




   Create a set of tables to hold all of the information returned by
   these 4 stored functions. Also creates a table to timestamp when a
   snapshot of data is taken.

   psql -f create-ps_procstat-tables.sql
Identify yourself.




   dbt3=# SELECT *
   FROM pg_backend_pid();

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



   dbt3=# i ps_procstat-snap.sql

   BEGIN

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

   COMMIT
Execute an SQL statement

   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



   dbt3=# 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 the script does (partially) should be the same as top:

   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}
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}
__      __     /                
           / ~~~/  . o O | Creating Custom |
    ,----(       oo     )  | Reports!        |
  /        __      __/                    /
 /|            ( |(
^     /___ / |
    |__|    |__|-"


ps-report-pl
__      __     /                       
           / ~~~/  . o O | Warning! Too much data |
    ,----(       oo     )  | to fit on screen!       |
  /        __      __/                           /
 /|            ( |(
^     /___ / |
    |__|    |__|-"
Creating Reports: Section 1


   Database       : dbt5
   Snapshot Start : 2010-03-26 15:24:51.516226-07
   Snapshot End   : 2010-03-26 15:25:51.57661-07

   -------------------
   Database Statistics
   -------------------
   Commits     : 421
   Rollbacks   : 2
   Blocks Read : 13919368
   Blocks Hit : 7876506
Creating Reports: Section 2


   ================
   Table Statistics
   ================
   ------------------------------------------ -------- ------------ -------- ------------- --------- --------
   Schema.Relation                            Seq Scan Seq Tup Read Idx Scan Idx Tup Fetch N Tup Ins N Tup Up
   ------------------------------------------ -------- ------------ -------- ------------- --------- --------



   ...

   public.account_permission                        0            0        3             3         0
   public.address                                   0            0      488           732         0
   public.broker                                  169         8067      259           259         0        3
   public.cash_transaction                          0            0      952           928        37        7
   public.charge                                   39          585        0             0         0
   public.commission_rate                          60         9820       18            44         0
   public.company                                   2         5000     1496          1496         0
   public.company_competitor                        0            0       61           183         0
   public.customer                                  0            0      375           375         0
   public.customer_account                          0            0      690           968         0        3
   public.customer_taxrate                         20       200000       40            40         0
   public.daily_market                              0            0     4322          4962         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
   --------------------------------------------------------------------- -------- ------------ -------------



   ...

   public.account_permission.pk_account_permission                             3            3             3
   public.address.pk_address                                                 488          732           732
   public.broker.pk_broker                                                   259          259           259
   public.cash_transaction.pk_cash_transaction                               952          998           928
   public.charge.pk_charge                                                     0            0             0
   public.commission_rate.pk_commission_rate                                  18           44             0
   public.company.i_co_name                                                   14           14            14
   public.company.pk_company                                                1482         1482          1482
   public.company_competitor.pk_company_competitor                            61          183           183
   public.customer.i_c_tax_id                                                 27           27            27
   public.customer.pk_customer                                               348          348           348
   public.customer_account.i_ca_c_id                                         198          477           476



   ...
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 . . .




    Links:
        http://git.postgresql.org/gitweb?p=pg_proctab.git
        git clone
        git://git.postgresql.org/git/pg proctab.git
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.
Ad

Recommended

pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Command Prompt., Inc
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
 
PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs
PGConf APAC
 
PostgreSQL and RAM usage
PostgreSQL and RAM usage
Alexey Bashtanov
 
PostgreSQL Performance Tuning
PostgreSQL Performance Tuning
elliando dias
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
 
Introduction VAUUM, Freezing, XID wraparound
Introduction VAUUM, Freezing, XID wraparound
Masahiko Sawada
 
MySQL Index Cookbook
MySQL Index Cookbook
MYXPLAIN
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
Kosuke Kida
 
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Carlos Sierra
 
MySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 Tips
OSSCube
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
Carlos Sierra
 
PostgreSql query planning and tuning
PostgreSql query planning and tuning
Federico Campoli
 
Postgresql database administration volume 1
Postgresql database administration volume 1
Federico Campoli
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINX, Inc.
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
オラクルエンジニア通信
 
PostgreSQL Deep Internal
PostgreSQL Deep Internal
EXEM
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
Deep dive to PostgreSQL Indexes
Deep dive to PostgreSQL Indexes
Ibrar Ahmed
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
DataGuard体験記
DataGuard体験記
Shinnosuke Akita
 
The Oracle RAC Family of Solutions - Presentation
The Oracle RAC Family of Solutions - Presentation
Markus Michalewicz
 
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
John Beresniewicz
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
NeoClova
 
Oracle_Patching_Untold_Story_Final_Part2.pdf
Oracle_Patching_Untold_Story_Final_Part2.pdf
Alex446314
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
Mikiya Okuno
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 

More Related Content

What's hot (20)

まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
Kosuke Kida
 
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Carlos Sierra
 
MySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 Tips
OSSCube
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
Carlos Sierra
 
PostgreSql query planning and tuning
PostgreSql query planning and tuning
Federico Campoli
 
Postgresql database administration volume 1
Postgresql database administration volume 1
Federico Campoli
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINX, Inc.
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
オラクルエンジニア通信
 
PostgreSQL Deep Internal
PostgreSQL Deep Internal
EXEM
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
Deep dive to PostgreSQL Indexes
Deep dive to PostgreSQL Indexes
Ibrar Ahmed
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
DataGuard体験記
DataGuard体験記
Shinnosuke Akita
 
The Oracle RAC Family of Solutions - Presentation
The Oracle RAC Family of Solutions - Presentation
Markus Michalewicz
 
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
John Beresniewicz
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
NeoClova
 
Oracle_Patching_Untold_Story_Final_Part2.pdf
Oracle_Patching_Untold_Story_Final_Part2.pdf
Alex446314
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
Mikiya Okuno
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
Kosuke Kida
 
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Understanding SQL Trace, TKPROF and Execution Plan for beginners
Carlos Sierra
 
MySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 Tips
OSSCube
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
Carlos Sierra
 
PostgreSql query planning and tuning
PostgreSql query planning and tuning
Federico Campoli
 
Postgresql database administration volume 1
Postgresql database administration volume 1
Federico Campoli
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINX, Inc.
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#3
オラクルエンジニア通信
 
PostgreSQL Deep Internal
PostgreSQL Deep Internal
EXEM
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
Deep dive to PostgreSQL Indexes
Deep dive to PostgreSQL Indexes
Ibrar Ahmed
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
The Oracle RAC Family of Solutions - Presentation
The Oracle RAC Family of Solutions - Presentation
Markus Michalewicz
 
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
John Beresniewicz
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
NeoClova
 
Oracle_Patching_Untold_Story_Final_Part2.pdf
Oracle_Patching_Untold_Story_Final_Part2.pdf
Alex446314
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
Mikiya Okuno
 

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

pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
8.4 Upcoming Features
8.4 Upcoming Features
PostgreSQL Experts, Inc.
 
PostgreSQL on Solaris
PostgreSQL on Solaris
Theo Schlossnagle
 
PostgreSQL on Solaris
PostgreSQL on Solaris
Theo Schlossnagle
 
PostgreSQL Performance Problems: Monitoring and Alerting
PostgreSQL Performance Problems: Monitoring and Alerting
Grant Fritchey
 
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Citus Data
 
Creating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at Scale
Sean Chittenden
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
Mark Wong
 
Managing terabytes: When PostgreSQL gets big
Managing terabytes: When PostgreSQL gets big
Selena Deckelmann
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Managing terabytes: When Postgres gets big
Managing terabytes: When Postgres gets big
Selena Deckelmann
 
Postgres performance for humans
Postgres performance for humans
Craig Kerstiens
 
Keith Fiske - When PostgreSQL Can't, You Can @ Postgres Open
Keith Fiske - When PostgreSQL Can't, You Can @ Postgres Open
PostgresOpen
 
Troubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenter
Alexey Lesovsky
 
Postgresql Database Administration Basic - Day2
Postgresql Database Administration Basic - Day2
PoguttuezhiniVP
 
Using Dynamic Statement Cache in DB2 9.1 for z/Os
Using Dynamic Statement Cache in DB2 9.1 for z/Os
César Buzzo
 
OSMC 2021 | pg_stat_monitor: A cool extension for better database (PostgreSQL...
OSMC 2021 | pg_stat_monitor: A cool extension for better database (PostgreSQL...
NETWAYS
 
Elegant database tuning
Elegant database tuning
Scott Mead
 
Aplicações 10x a 100x mais rápida com o postgre sql
Aplicações 10x a 100x mais rápida com o postgre sql
Fabio Telles Rodriguez
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
pg_proctab: Accessing System Stats in PostgreSQL
pg_proctab: Accessing System Stats in PostgreSQL
Mark Wong
 
PostgreSQL Performance Problems: Monitoring and Alerting
PostgreSQL Performance Problems: Monitoring and Alerting
Grant Fritchey
 
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Monitoring Postgres at Scale | PostgresConf US 2018 | Lukas Fittl
Citus Data
 
Creating PostgreSQL-as-a-Service at Scale
Creating PostgreSQL-as-a-Service at Scale
Sean Chittenden
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
PostgreSQL Portland Performance Practice Project - Database Test 2 Howto
Mark Wong
 
Managing terabytes: When PostgreSQL gets big
Managing terabytes: When PostgreSQL gets big
Selena Deckelmann
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
Alexey Lesovsky
 
Managing terabytes: When Postgres gets big
Managing terabytes: When Postgres gets big
Selena Deckelmann
 
Postgres performance for humans
Postgres performance for humans
Craig Kerstiens
 
Keith Fiske - When PostgreSQL Can't, You Can @ Postgres Open
Keith Fiske - When PostgreSQL Can't, You Can @ Postgres Open
PostgresOpen
 
Troubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenter
Alexey Lesovsky
 
Postgresql Database Administration Basic - Day2
Postgresql Database Administration Basic - Day2
PoguttuezhiniVP
 
Using Dynamic Statement Cache in DB2 9.1 for z/Os
Using Dynamic Statement Cache in DB2 9.1 for z/Os
César Buzzo
 
OSMC 2021 | pg_stat_monitor: A cool extension for better database (PostgreSQL...
OSMC 2021 | pg_stat_monitor: A cool extension for better database (PostgreSQL...
NETWAYS
 
Elegant database tuning
Elegant database tuning
Scott Mead
 
Aplicações 10x a 100x mais rápida com o postgre sql
Aplicações 10x a 100x mais rápida com o postgre sql
Fabio Telles Rodriguez
 
Ad

More from Mark Wong (18)

OHAI, my name is Chelnik! PGCon 2014 Mockumentary
OHAI, my name is Chelnik! PGCon 2014 Mockumentary
Mark Wong
 
OHAI, my name is Chelnik! Postgres Open 2013 Report
OHAI, my name is Chelnik! Postgres Open 2013 Report
Mark Wong
 
collectd & PostgreSQL
collectd & PostgreSQL
Mark Wong
 
Android & PostgreSQL
Android & PostgreSQL
Mark Wong
 
PGTop for Android: Things I learned making this app
PGTop for Android: Things I learned making this app
Mark Wong
 
Introduction to PostgreSQL
Introduction to PostgreSQL
Mark Wong
 
Developing PGTop for Android
Developing PGTop for Android
Mark Wong
 
Pg in-the-brazilian-armed-forces-presentation
Pg in-the-brazilian-armed-forces-presentation
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Tuning
PostgreSQL Portland Performance Practice Project - Database Test 2 Tuning
Mark Wong
 
Filesystem Performance from a Database Perspective
Filesystem Performance from a Database Perspective
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Filesystem...
PostgreSQL Portland Performance Practice Project - Database Test 2 Filesystem...
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Workload D...
PostgreSQL Portland Performance Practice Project - Database Test 2 Workload D...
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Background
PostgreSQL Portland Performance Practice Project - Database Test 2 Background
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Series Ove...
PostgreSQL Portland Performance Practice Project - Database Test 2 Series Ove...
Mark Wong
 
pg_top is 'top' for PostgreSQL: pg_top + pg_proctab
pg_top is 'top' for PostgreSQL: pg_top + pg_proctab
Mark Wong
 
Linux Filesystems, RAID, and more
Linux Filesystems, RAID, and more
Mark Wong
 
pg_top is 'top' for PostgreSQL
pg_top is 'top' for PostgreSQL
Mark Wong
 
What Is Going On?
What Is Going On?
Mark Wong
 
OHAI, my name is Chelnik! PGCon 2014 Mockumentary
OHAI, my name is Chelnik! PGCon 2014 Mockumentary
Mark Wong
 
OHAI, my name is Chelnik! Postgres Open 2013 Report
OHAI, my name is Chelnik! Postgres Open 2013 Report
Mark Wong
 
collectd & PostgreSQL
collectd & PostgreSQL
Mark Wong
 
Android & PostgreSQL
Android & PostgreSQL
Mark Wong
 
PGTop for Android: Things I learned making this app
PGTop for Android: Things I learned making this app
Mark Wong
 
Introduction to PostgreSQL
Introduction to PostgreSQL
Mark Wong
 
Developing PGTop for Android
Developing PGTop for Android
Mark Wong
 
Pg in-the-brazilian-armed-forces-presentation
Pg in-the-brazilian-armed-forces-presentation
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Tuning
PostgreSQL Portland Performance Practice Project - Database Test 2 Tuning
Mark Wong
 
Filesystem Performance from a Database Perspective
Filesystem Performance from a Database Perspective
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Filesystem...
PostgreSQL Portland Performance Practice Project - Database Test 2 Filesystem...
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Workload D...
PostgreSQL Portland Performance Practice Project - Database Test 2 Workload D...
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Background
PostgreSQL Portland Performance Practice Project - Database Test 2 Background
Mark Wong
 
PostgreSQL Portland Performance Practice Project - Database Test 2 Series Ove...
PostgreSQL Portland Performance Practice Project - Database Test 2 Series Ove...
Mark Wong
 
pg_top is 'top' for PostgreSQL: pg_top + pg_proctab
pg_top is 'top' for PostgreSQL: pg_top + pg_proctab
Mark Wong
 
Linux Filesystems, RAID, and more
Linux Filesystems, RAID, and more
Mark Wong
 
pg_top is 'top' for PostgreSQL
pg_top is 'top' for PostgreSQL
Mark Wong
 
What Is Going On?
What Is Going On?
Mark Wong
 
Ad

Recently uploaded (20)

GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
Safe Software
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Priyanka Aash
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
Safe Software
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Priyanka Aash
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
AI vs Human Writing: Can You Tell the Difference?
AI vs Human Writing: Can You Tell the Difference?
Shashi Sathyanarayana, Ph.D
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 

pg_proctab: Accessing System Stats in PostgreSQL

  • 1. pg proctab Accessing System Stats in PostgreSQL Mark Wong [email protected] PostgreSQL Conference East 2010 March 25-28, 2010
  • 2. Slides available on slideshare http://www.slideshare.net/markwkm
  • 3. Agenda Brief review of what PostgreSQL stats are available How pg proctab may help
  • 4. Review Some of the PostgreSQL system catalog tables: pg stat activity pg stat database pg stat all tables pg stat all indexes pg statio all tables pg statio all indexes
  • 5. Example: pg stat activity SELECT datname, procpid, usename, current_query FROM pg_stat_activity WHERE current_query <> ’<IDLE>’; datname dbt5 procpid 3260 usename postgres current_query SELECT * FROM TradeLookupFrame3( ’2006-2-27 9:15:0’,43000050000,20, ’2005-11-23 12:6:8’,’ENGAPRB’) ...
  • 6. Example: pg stat database SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database ORDER BY datname; datname dbt5 numbackends 11 xact_commit 228458 xact_rollback 320
  • 7. Example: pg stat all tables SELECT seq_scan, idx_scan, n_tup_ins, n_tup_upd, n_tup_del FROM pg_stat_all_tables WHERE relname = ’customer’; seq_scan 10 idx_scan 152795 n_tup_ins 5000 n_tup_upd 0 n_tup_del 0
  • 8. Example: pg statio all tables SELECT heap_blks_read, heap_blks_hit, idx_blks_read, idx_blks_hit FROM pg_statio_all_tables WHERE relname = ’customer’; heap_blks_read 26897 heap_blks_hit 141581 idx_blks_read 5577 idx_blks_hit 328770
  • 9. __ __ / ~~~/ . o O ( Want more! ) ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 10. What about operating system statistics? I/O? — iostat Processor Utilization? — mpstat Per Process Statistics? — pidstat Other system activity? — sar and so on...
  • 11. Introducing pg proctab pg proctab is a collection of four C stored functions: pg cputime pg loadavg pg memusage pg proctab
  • 12. __ __ / ~~~/ . o O ( Examples? ) ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 13. Some of the things pg proctab should help with 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 Note: Following examples are from Linux based systems.
  • 14. pg cputime() Example SELECT * FROM pg_cputime(); user 31529387 nice 76 system 6865679 idle 574707718 iowait 1985455
  • 15. 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
  • 16. pg loadavg() Example SELECT * FROM pg_loadavg(); load1 7.71 load5 7.73 load15 7.62 last_pid 4623
  • 17. 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
  • 18. pg memusage() Example SELECT * FROM pg_memusage(); memused 32793836 memfree 157704 memshared 0 membuffers 94216 memcached 31749292 swapused 13960 swapfree 3986216 swapcached 1264
  • 19. 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. (For Solaris.) 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
  • 20. 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 ...
  • 21. 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
  • 22. __ __ / ~~~/ . o O ( More useful examples? ) ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 23. pg proctab() Example SELECT datname, procpid, processor, state, fullcomm FROM pg_stat_activity, pg_proctab() WHERE procpid = pid; datname dbt5 procpid 3260 processor 6 state R fullcomm postgres: postgres dbt5 207.173.203.228(48950) SELECT datname dbt5 procpid 3261 processor 1 state R fullcomm postgres: postgres dbt5 207.173.203.228(48953) SELECT
  • 24. __ __ / / ~~~/ . o O | Measuring performance | ,----( oo ) | of a query. | / __ __/ / /| ( |( ^ /___ / | |__| |__|-" You can find the following helper scripts in the pg proctab contrib directory.
  • 25. Create snapshot tables Create a set of tables to hold all of the information returned by these 4 stored functions. Also creates a table to timestamp when a snapshot of data is taken. psql -f create-ps_procstat-tables.sql
  • 26. Identify yourself. dbt3=# SELECT * FROM pg_backend_pid(); pg_backend_pid ---------------- 4590 (1 row)
  • 27. Take a snapshot before running the query dbt3=# i ps_procstat-snap.sql BEGIN ps_snap_stats --------------- 1 (1 row) COMMIT
  • 28. Execute an SQL statement 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;
  • 29. Take a snapshot after running the query dbt3=# i ps_procstat-snap.sql BEGIN ps_snap_stats --------------- 2 (1 row) COMMIT
  • 30. Calculate Processor Utilization $ ./ps-processor-utilization.sh [pid] [before] [after] $ ./ps-processor-utilization.sh 4590 1 2 Processor Utilization = 1.00 % What the script does (partially) should be the same as top: 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}
  • 31. 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}
  • 32. __ __ / / ~~~/ . o O | Creating Custom | ,----( oo ) | Reports! | / __ __/ / /| ( |( ^ /___ / | |__| |__|-" ps-report-pl
  • 33. __ __ / / ~~~/ . o O | Warning! Too much data | ,----( oo ) | to fit on screen! | / __ __/ / /| ( |( ^ /___ / | |__| |__|-"
  • 34. Creating Reports: Section 1 Database : dbt5 Snapshot Start : 2010-03-26 15:24:51.516226-07 Snapshot End : 2010-03-26 15:25:51.57661-07 ------------------- Database Statistics ------------------- Commits : 421 Rollbacks : 2 Blocks Read : 13919368 Blocks Hit : 7876506
  • 35. Creating Reports: Section 2 ================ Table Statistics ================ ------------------------------------------ -------- ------------ -------- ------------- --------- -------- Schema.Relation Seq Scan Seq Tup Read Idx Scan Idx Tup Fetch N Tup Ins N Tup Up ------------------------------------------ -------- ------------ -------- ------------- --------- -------- ... public.account_permission 0 0 3 3 0 public.address 0 0 488 732 0 public.broker 169 8067 259 259 0 3 public.cash_transaction 0 0 952 928 37 7 public.charge 39 585 0 0 0 public.commission_rate 60 9820 18 44 0 public.company 2 5000 1496 1496 0 public.company_competitor 0 0 61 183 0 public.customer 0 0 375 375 0 public.customer_account 0 0 690 968 0 3 public.customer_taxrate 20 200000 40 40 0 public.daily_market 0 0 4322 4962 0 ...
  • 36. Creating Reports: Section 2 - Falling off the right side... N Tup Upd N Tup Del Last Vacuum Last Autovacuum Last Analyze Last Autoanalyze
  • 37. Creating Reports: Section 3 ================ Index Statistics ================ --------------------------------------------------------------------- -------- ------------ ------------- Schema.Relation.Index Idx Scan Idx Tup Read Idx Tup Fetch --------------------------------------------------------------------- -------- ------------ ------------- ... public.account_permission.pk_account_permission 3 3 3 public.address.pk_address 488 732 732 public.broker.pk_broker 259 259 259 public.cash_transaction.pk_cash_transaction 952 998 928 public.charge.pk_charge 0 0 0 public.commission_rate.pk_commission_rate 18 44 0 public.company.i_co_name 14 14 14 public.company.pk_company 1482 1482 1482 public.company_competitor.pk_company_competitor 61 183 183 public.customer.i_c_tax_id 27 27 27 public.customer.pk_customer 348 348 348 public.customer_account.i_ca_c_id 198 477 476 ...
  • 38. 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.
  • 40. __ __ / ~~~/ . o O ( Thank you! ) ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 41. . . . the fine print . . . Links: http://git.postgresql.org/gitweb?p=pg_proctab.git git clone git://git.postgresql.org/git/pg proctab.git
  • 42. Acknowledgements Haley Jane Wakenshaw __ __ / ~~~/ ,----( oo ) / __ __/ /| ( |( ^ /___ / | |__| |__|-"
  • 43. 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.