User Tools

Site Tools


wiki:postgres:pg_tune_kurs_monitoring

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

wiki:postgres:pg_tune_kurs_monitoring [2017/09/28 12:21] (current)
Line 1: Line 1:
 +====== Monitoring ======
 +[[http://​www.postgresql.org/​docs/​9.0/​interactive/​monitoring-stats.html|PostgreSQL 9.0 Documentation:​ The Statistics Collector]]
 +
 +**Hans-Jürgen Schönig: "Beim Monitoring geht es darum, rauszufinden wo die Handbremse ist (generelle Regel)."​**\\
 +\\
 +Von Hans gibt es auch eine Software (PHP und Query2Graph,​ d.h. großteils SQL-basiert) welche Statistiken ausgibt: [[http://​www.cybertec.at/​en/​postgresql_products/​pgwatch-cybertec-enterprise-postgresql-monitor|pg_watch]]
 +
 +
 +===== Datenbank Connections =====
 +
 +  test#\x
 +  Expanded Display is on.  # nochmals "​\x"​ setzt wieder zurück
 +  ​
 +  test# SELECT * FROM pg_stat_activity; ​  #pro Datenbank-Verbindung ein Eintrag
 +  ​
 +Das Attribut "​application_name"​ kann gesetzt werden. Zum debuggen (wenn mehrere Anwendungen auf die Datenbank zugreifen). Ist in der Anwendung zu setzen:
 +  SET application_name TO '​app_name'​
 +
 +Es sollte auch jedenfalls **Connection pooling** in den Anwendungen verwendet werden, damit nicht bei jeder Anfrage an die Datenbank eine neue Verbindung aufgebaut werden muss.
 +
 +===== Datenbank Statistik =====
 +
 +  test# SELECT * FROM  pg_stat_database;​
 +  datid         | 17380
 +  datname ​      | bfw
 +  numbackends ​  | 1
 +  xact_commit ​  | 2556
 +  xact_rollback | 6
 +  blks_read ​    | 333        # Anzahl der 8k-Blöcke die vom Kernel, Controller, Disk geholt wurden (ohne shared buffers)
 +  blks_hit ​     | 75212      # Anzahl der 8k-Blöcke die vom Shared Buffer geholt wurden
 +  tup_returned ​ | 886701 ​    # wenn signifikant höher, dann eher lesen
 +  tup_fetched ​  | 33919      # ?
 +  tup_inserted ​ | 0
 +  tup_updated ​  | 4
 +  tup_deleted ​  | 0
 +
 +===== Tabellen Statistik =====
 +
 +  test# SELECT * FROM pg_stat_user_tables limit 1;
 +  -[ RECORD 1 ]----+------------------------------
 +  relid            | 25992
 +  schemaname ​      | public
 +  relname ​         | t_data_2009
 +  seq_scan ​        | 18
 +  seq_tup_read ​    | 4352
 +  idx_scan ​        |
 +  idx_tup_fetch ​   |
 +  n_tup_ins ​       | 0
 +  n_tup_upd ​       | 0
 +  n_tup_del ​       | 0
 +  n_tup_hot_upd ​   | 0
 +  n_live_tup ​      | 256
 +  n_dead_tup ​      | 0
 +  last_vacuum ​     | 2011-04-21 12:​37:​14.824971+02
 +  last_autovacuum ​ |
 +  last_analyze ​    |
 +  last_autoanalyze |
 +
 +
 +  * idx_scan: Wenn //NULL// dann existiert kein Index. Wenn //0// dann gibt es einen Index der nie verwendet wurde
 +  * seq_scan: Anzahl der Sequenziellen Scans
 +  * seq_tup_read:​ Anzahl der Tupel die sequentiell gefunden wurden
 +  * idx_tup_fetch
 +\\
 +**Wenn Verhältnis seq_scan : seq_tup_read >> idx_scan : idx_tup_fetch => Es fehlt üblicherweise ein Index**\\
 +
 +  test=# SELECT * FROM pg_stat_user_tables ORDER BY seq_tup_read DESC;
 +  ​
 +Oder wenn möglich (kein 0 oder NULL, sh. unten) Verhältnisse
 +
 +  test=# SELECT * FROM pg_stat_user_tables ORDER BY ( ( seq_tup_read * idx_scan ) / ( idx_tup_fetch * seq_scan ) ) DESC;
 +  ERROR: ​ division by zero
 +
 +Daraus ergibt sich üblicherweise ein sogenannter "​Hockey Stick" mit den Problembereichen im oberen Teil (da ORDER BY ... DESC).\\
 +\\
 +Indices fehlen, wenn viele (teure) sequentielle Scans (seq_scan) in "​pg_stat_user_tables"​ oder schlecht programmierte Applikation(en).
 +
 +  z.B.:
 +  seq_scan = 1000, seq_tup_read = 10000  # bedeutet das ~ 1000 mal 10 Datensätze sequentiell gelesen wurden -> dies ist o.k.
 +  ​
 +  aber:
 +  seq_scan = 1000 und seq_tup_read = 1000000000 ​   # bedeutet 1Mio Datensätze 1000 mal gelesen -> das STINKT!
 +\\
 +  * n_tup_hot_upd:​ Anzahl der Updates innerhalb einer Page (hot update, Microvacuum) -> Optimierung über fillfactor
 +
 +===== Index Statistik =====
 +Welcher Index auf welcher Tabelle wurde wie oft gelesen.\\
 +  test=# SELECT * FROM pg_stat_user_indexes limit 1;
 +  -[ RECORD 1 ]-+---------------------
 +  relid         | 17734
 +  indexrelid ​   | 17740
 +  schemaname ​   | public
 +  relname ​      | spatial_ref_sys
 +  indexrelname ​ | spatial_ref_sys_pkey
 +  idx_scan ​     | 0
 +  idx_tup_read ​ | 0
 +  idx_tup_fetch | 0
 +
 +===== Index I/O Statistik =====
 +
 +  test=# \d pg_statio_user_indexes
 +  View "​pg_catalog.pg_statio_user_indexes"​
 +      Column ​    ​| ​ Type  | Modifiers
 +  ---------------+--------+-----------
 +   ​relid ​        | oid    |
 +   ​indexrelid ​   | oid    |
 +   ​schemaname ​   | name   |
 +   ​relname ​      | name   |
 +   ​indexrelname ​ | name   |
 +   ​idx_blks_read | bigint |
 +   ​idx_blks_hit ​ | bigint |
 +
 +  * idx_blks_hit ... aus shared buffer gelesen
 +
 +===== Table I/O Statistik =====
 +
 +  test=# \d pg_statio_user_tables
 +  View "​pg_catalog.pg_statio_user_tables"​
 +       ​Column ​     |  Type  | Modifiers
 +  -----------------+--------+-----------
 +   ​relid ​          | oid    |
 +   ​schemaname ​     | name   |
 +   ​relname ​        | name   |
 +   ​heap_blks_read ​ | bigint |
 +   ​heap_blks_hit ​  | bigint |
 +   ​idx_blks_read ​  | bigint |
 +   ​idx_blks_hit ​   | bigint |
 +   ​toast_blks_read | bigint |
 +   ​toast_blks_hit ​ | bigint |
 +   ​tidx_blks_read ​ | bigint |
 +   ​tidx_blks_hit ​  | bigint |
 +
 +  * **Cash Hit Rate für die Tabelle** ​   =   ​heap_blks_read :  heap_blks_hit
 +  * **Cash Hit Rate für die Index** ​     =    idx_blks_read :   ​idx_blks_hit
 +  * **Cash Hit Rate für TOAST-Tabelle** ​ =  toast_blks_read : toast_blks_hit
 +  * **Cash Hit Rate für TOAST-Index** ​   =   ​tidx_blks_read :  tidx_blks_hit
 +
 +===== Function Statistik =====
 +  test=# \d pg_stat_user_functions
 +  View "​pg_catalog.pg_stat_user_functions"​
 +     ​Column ​  ​| ​ Type  | Modifiers
 +  ------------+--------+-----------
 +   ​funcid ​    | oid    |
 +   ​schemaname | name   |
 +   ​funcname ​  | name   |
 +   ​calls ​     | bigint |
 +   ​total_time | bigint |
 +   ​self_time ​ | bigint |
 +
 +  * total_time = gesamte Laufzeit inklusive Unterfunktionen;​ self_time = nur die Funktion selbst.
 +
 +===== Checkpoint Statistik =====
 +
 +  test=# \d pg_stat_bgwriter
 +     View "​pg_catalog.pg_stat_bgwriter"​
 +         ​Column ​      ​| ​ Type  | Modifiers
 +  --------------------+--------+-----------
 +   ​checkpoints_timed ​ | bigint |
 +   ​checkpoints_req ​   | bigint |
 +   ​buffers_checkpoint | bigint |
 +   ​buffers_clean ​     | bigint |
 +   ​maxwritten_clean ​  | bigint |
 +   ​buffers_backend ​   | bigint |
 +   ​buffers_alloc ​     | bigint |
 +
 +  * Wieviele Checkpoints
  
wiki/postgres/pg_tune_kurs_monitoring.txt · Last modified: 2017/09/28 12:21 (external edit)