PostgreSQL Advent Calendar 2012ïŒå
šéšä¿ºïŒã®Day 8ã§ãã
仿¥ã¯ãPostgreSQLã®çµ±èšæ å ±ãç¶²çŸ çã«åéã»èç©ããPgPerfããã±ãŒãžã®ç޹ä»ãããŸãã
ãã®ããã±ãŒãžã¯ãæ¬æ¥ãªãªãŒã¹ãããã®ã§ãã
snaga/pgperf-snapshot
https://github.com/uptimejp/pgperf-snapshot
PostgreSQLã§ã¯ãåäœã«ã€ããŠã®å éšã®æ å ±ãååŸããããã«ãããŸããŸãªã·ã¹ãã ãã¥ãŒãSQL颿°ããããŸãã
çµ±èšæ å ±ã³ã¬ã¯ã¿
http://www.postgresql.jp/document/9.0/html/monitoring-stats.html
ã·ã¹ãã 管ç颿°
http://www.postgresql.jp/document/9.0/html/functions-admin.html
ãã®æ å ±ãååŸããããšã§ãPostgreSQLã®å éšã§ã©ã®ãããªåŠçãè¡ãããŠããã®ããç¥ãããšãã§ããŸãã
äžæ¹ã§ããããã®å éšã®çµ±èšæ å ±ã¯æã å»ã ãšå€åããŠãããããããŒã¿ããŒã¹ãµãŒãã®éçšãšãã芳ç¹ã§èŠãå Žåã«ã¯ããã¡ããšèšé²ãããŠããå¿ èŠããããŸãã
ãŸããããŒã¿ããŒã¹ã®ç£èŠãããã©ãŒãã³ã¹ã®åæã«ã¯ããŸããŸãªè§åºŠãããããã®å éšã®çµ±èšæ å ±ãåæããå¿ èŠããããŸãããããäœãåé¡ãèµ·ãã£ãŠåæããããšãããšãå¿ èŠãªæ å ±ãåããŠããªãããšãã£ãããšãèµ·ããããŸãã
ã€ãŸããããŒã¿ããŒã¹ã®éçšãè¡ãäžã§ã¯ãåŸã«åæããéã«å¿ èŠã«ãªãå¯èœæ§ãèæ ®ããŠããæåããã宿çã«ãç¶²çŸ çã«ãæ å ±ãåéããŠããããšãéèŠã«ãªããŸãã
PostgreSQLã§ã¯ãããŸãŸã§ã«ãããã€ãããã©ãŒãã³ã¹é¢é£ã®çµ±èšæ å ±ãååŸãããã¬ããŒãããããŒã«ãååšããŠããŸããã
ãããããåäœãããããã®èšå®ãè€éã§ãããããããŒã«ãè€éã§ã¡ã³ããã³ã¹ãé£ãããããç¹å®ã®ã¬ããŒããåºãã®ã«ç¹åããŠããããšãã£ã課é¡ããããŸããã
ä»åãªãªãŒã¹ãããPgPerfããã±ãŒãžãã¯ãããã©ãŒãã³ã¹é¢é£ã®çµ±èšæ å ±ã
ãã®ãããå®è£ ã®ç¹åŸŽãšããŠã¯ã
pgstattupleãpg_stat_statementsãªã©ã®contribã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŠããªããŠããããã©ã«ãã§ååŸã§ããæ å ±ã¯ãã¹ãŠååŸããŸããããããã®contribã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŠããã°ãããã®æ å ±ã䜵ããŠååŸããŸãã
PgPerfããã±ãŒãžã®è©³çްãªããã¥ã¢ã«ãèªã¿ããæ¹ã¯ãã¡ããã芧ãã ããã
PgPerfããã±ãŒãžãŠãŒã¶ãŒããã¥ã¢ã«
http://www.uptime.jp/go/pgperf-snapshot
PgPerfããã±ãŒãžã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ããåã¡ãžã£ãŒããŒãžã§ã³ã«å¯Ÿå¿ãã pgperf_install.sql ã¹ã¯ãªããããcontribã¢ãžã¥ãŒã«ãšåãããã«ããŒã¿ããŒã¹ã«å¯ŸããŠã€ã³ã¹ããŒã«ããã ãã§ãã
ããã§ã¯ãã€ã³ã¹ããŒã«ããPgPerfããã±ãŒãžã䜿ã£ãŠãçµ±èšæ å ±ã®ã¹ãããã·ã§ãããååŸããŠã¿ãŸãã
ã¹ãããã·ã§ãããååŸããã«ã¯ãpgpgerf.create_snapshot()ãšããSQL颿°ã䜿çšããŸãã
ããã§ã¯ããŸãã¯ãã£ãšãåºæ¬çãªã¹ãããã·ã§ããååŸã¬ãã«1ã§ååŸããŠã¿ãŸãã
ååŸããã¹ãããã·ã§ããã¯ãpgperfã¹ããŒãå ã«ãããsnapshot_ãã§å§ãŸãè€æ°ã®ããŒãã«ã«æ ŒçŽãããŸãã
pgperf.snapshotããŒãã«ã¯ãã¹ãããã·ã§ããååŸæå»ãšã¹ãããã·ã§ããIDã®å¯Ÿå¿ãä¿åããããŒãã«ã§ãããã®ããŒãã«ãåç §ãããšããã€ååŸããã¹ãããã·ã§ãããªã®ããã¹ãããã·ã§ããIDãäœçªãªã®ãããšãã£ãæ å ±ã確èªããããšãã§ããŸãã
äŸãã°ãããã¯ã°ã©ãŠã³ãã©ã€ã¿ã®çµ±èšæ å ±ãååŸã§ããpg_stat_bgwriterã·ã¹ãã ãã¥ãŒã®ã¹ãããã·ã§ããã¯pgperf.snapshot_pg_stat_bgwriterããŒãã«ã«ä¿åãããããšãã£ãä»çµã¿ã§ãã
PgPerfããã±ãŒãžãŠãŒã¶ãŒããã¥ã¢ã«
http://www.uptime.jp/go/pgperf-snapshot
ã¹ãããã·ã§ãããåé€ããã«ã¯ãã¹ãããã·ã§ããIDãæå®ããŠpgperf.delete_snapshot()颿°ã䜿ããŸããæå®ããã¹ãããã·ã§ããIDã®ã¹ãããã·ã§ããããŒã¿ãããã¹ãŠã®ã¹ãããã·ã§ããããŒãã«ããäžæ¬ããŠåé€ããŠãããŸãã
åºæ¬çã«ã¹ãããã·ã§ããã®ããŒã¿ã¯èç©ããŠãããã®ã§ãããããäžå®ã®æé以äžçµéããå€ããã®ã¯åé€ããããããšãã£ãå ŽåããããšæããŸãããã®ãããªå Žåã«ã¯ãpgperf.purge_snapshots()颿°ã䜿ããŸãã
pgperf.purge_snapshots()颿°ã¯ãåŒæ°ã«INTERVALåã®å€ãåããæå®ããæéããå€ãã¹ãããã·ã§ãããäžæ¬ããŠåé€ããŸãã
以äžã®äŸã¯ãååŸããŠãã32æ¥ä»¥äžçµéããã¹ãããã·ã§ãããåé€ããŠããäŸã§ãã
PgPerfããã±ãŒãžã¯ãPL/pgSQLã§äœæãããSQL颿°ãšããŒãã«é¡ã§æ§æãããŠããããã¹ãŠpgperfã¹ããŒãå ã«äœæãããŸãã
ã§ãã®ã§ãã¢ã³ã€ã³ã¹ããŒã«ããå Žåã«ã¯pgperfã¹ããŒããCASCADEæå®ã§DROPããããšã§ããããã«ã¢ã³ã€ã³ã¹ããŒã«ããããšãã§ããŸããpgperf_uninstall.sqlã¹ã¯ãªããã¯ããã®åŠçãè¡ã£ãŠãããŸãã
ä»åã¯ãPostgreSQLã®ããã©ãŒãã³ã¹çµ±èšæ å ±ãååŸã»èç©ããæ¹æ³ãšããŠãPgPerfããã±ãŒãžã®ç޹ä»ãšããã®åºæ¬çãªäœ¿ãæ¹ã®è§£èª¬ãããŸããã
PgPerfããã±ãŒãžã¯ãã€ã³ã¹ããŒã«ããã®ã䜿ã£ãŠã¿ãã®ãïŒãã¡ããã¢ã³ã€ã³ã¹ããŒã«ãïŒéåžžã«ç°¡åã§ãã®ã§ããã²è©ŠããŠã¿ãŠããã ããã°ãšæããŸãã
ææ¥ã¯ããã®PgPerfããã±ãŒãžã䜿ã£ãŠèç©ããã¹ãããã·ã§ããããŒã¿ããSQLã䜿ã£ãŠåæããæ¹æ³ã埡玹ä»ããŸãã
ã§ã¯ããŸãã
仿¥ã¯ãPostgreSQLã®çµ±èšæ å ±ãç¶²çŸ çã«åéã»èç©ããPgPerfããã±ãŒãžã®ç޹ä»ãããŸãã
ãã®ããã±ãŒãžã¯ãæ¬æ¥ãªãªãŒã¹ãããã®ã§ãã
snaga/pgperf-snapshot
https://github.com/uptimejp/pgperf-snapshot
â PostgreSQLã®çµ±èšæ å ±ã®èšé²ãšç£èŠ
PostgreSQLã§ã¯ãåäœã«ã€ããŠã®å éšã®æ å ±ãååŸããããã«ãããŸããŸãªã·ã¹ãã ãã¥ãŒãSQL颿°ããããŸãã
çµ±èšæ å ±ã³ã¬ã¯ã¿
http://www.postgresql.jp/document/9.0/html/monitoring-stats.html
ã·ã¹ãã 管ç颿°
http://www.postgresql.jp/document/9.0/html/functions-admin.html
ãã®æ å ±ãååŸããããšã§ãPostgreSQLã®å éšã§ã©ã®ãããªåŠçãè¡ãããŠããã®ããç¥ãããšãã§ããŸãã
äžæ¹ã§ããããã®å éšã®çµ±èšæ å ±ã¯æã å»ã ãšå€åããŠãããããããŒã¿ããŒã¹ãµãŒãã®éçšãšãã芳ç¹ã§èŠãå Žåã«ã¯ããã¡ããšèšé²ãããŠããå¿ èŠããããŸãã
ãŸããããŒã¿ããŒã¹ã®ç£èŠãããã©ãŒãã³ã¹ã®åæã«ã¯ããŸããŸãªè§åºŠãããããã®å éšã®çµ±èšæ å ±ãåæããå¿ èŠããããŸãããããäœãåé¡ãèµ·ãã£ãŠåæããããšãããšãå¿ èŠãªæ å ±ãåããŠããªãããšãã£ãããšãèµ·ããããŸãã
ã€ãŸããããŒã¿ããŒã¹ã®éçšãè¡ãäžã§ã¯ãåŸã«åæããéã«å¿ èŠã«ãªãå¯èœæ§ãèæ ®ããŠããæåããã宿çã«ãç¶²çŸ çã«ãæ å ±ãåéããŠããããšãéèŠã«ãªããŸãã
â ããã©ãŒãã³ã¹çµ±èšæ å ±ãååŸã»ä¿åããPgPerfããã±ãŒãž
PostgreSQLã§ã¯ãããŸãŸã§ã«ãããã€ãããã©ãŒãã³ã¹é¢é£ã®çµ±èšæ å ±ãååŸãããã¬ããŒãããããŒã«ãååšããŠããŸããã
ãããããåäœãããããã®èšå®ãè€éã§ãããããããŒã«ãè€éã§ã¡ã³ããã³ã¹ãé£ãããããç¹å®ã®ã¬ããŒããåºãã®ã«ç¹åããŠããããšãã£ã課é¡ããããŸããã
ä»åãªãªãŒã¹ãããPgPerfããã±ãŒãžãã¯ãããã©ãŒãã³ã¹é¢é£ã®çµ±èšæ å ±ã
- å éšã®ã·ã¹ãã ãã¥ãŒãªã©ã®ã»ãŒåã圢åŒã§ã
- 皌åããŠããã·ã¹ãã ã«æ¥µåæãå ããã«ã
- ãã¹ãŠãç¶²çŸ çã«ååŸã»èç©ãã
- åŸããèªç±ã«åæã§ããããã«ãã
ãã®ãããå®è£ ã®ç¹åŸŽãšããŠã¯ã
- ã¹ã¯ãªããïŒSQLãPL/pgSQLïŒã®ã¿ã§åäœãããããPostgreSQLã®çšŒåããŠãããã©ãããã©ãŒã ã«äŸåããªãã
- åçš®æ§èœæ å ±ã容æã«ååŸã»ä¿åããããšãã§ããèç©ããããŒã¿ãèªç±ã«åæã»æŽ»çšããããšãã§ããã
- ã€ã³ã¹ããŒã«ããã³ã¢ã³ã€ã³ã¹ããŒã«ã容æã§ã皌åããŠããPostgreSQLã®èšå®ã倿Žããå¿ èŠããªãã
pgstattupleãpg_stat_statementsãªã©ã®contribã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŠããªããŠããããã©ã«ãã§ååŸã§ããæ å ±ã¯ãã¹ãŠååŸããŸããããããã®contribã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããŠããã°ãããã®æ å ±ã䜵ããŠååŸããŸãã
PgPerfããã±ãŒãžã®è©³çްãªããã¥ã¢ã«ãèªã¿ããæ¹ã¯ãã¡ããã芧ãã ããã
PgPerfããã±ãŒãžãŠãŒã¶ãŒããã¥ã¢ã«
http://www.uptime.jp/go/pgperf-snapshot
â PgPerfããã±ãŒãžã®ã€ã³ã¹ããŒã«
PgPerfããã±ãŒãžã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ããåã¡ãžã£ãŒããŒãžã§ã³ã«å¯Ÿå¿ãã pgperf_install.sql ã¹ã¯ãªããããcontribã¢ãžã¥ãŒã«ãšåãããã«ããŒã¿ããŒã¹ã«å¯ŸããŠã€ã³ã¹ããŒã«ããã ãã§ãã
äœæãããšãããŒã¿ããŒã¹å ã«pgperfãšããã¹ããŒããäœæãããã¹ãããã·ã§ããååŸçšã®ããŒãã«ãSQL颿°ãäœæãããããšãåãããŸãã
[snaga@devsv02 pgperf-snapshot]$ psql -f pgperf_install91.sql testdb
BEGIN
CREATE SCHEMA
psql:pgperf_install91.sql:28: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "snapshot_pkey" for table "snapshot"
CREATE TABLE
CREATE FUNCTION
(...snip...)
CREATE FUNCTION
COMMIT
[snaga@devsv02 pgperf-snapshot]$
[snaga@devsv02 pgperf-snapshot]$ psql testdb
psql (9.0.6, server 9.1.2)
Type "help" for help.
testdb=# SET search_path TO pgperf;
SET
testdb=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------------------------+-------+----------
pgperf | snapshot | table | postgres
pgperf | snapshot_pg_current_xlog | table | postgres
pgperf | snapshot_pg_locks | table | postgres
pgperf | snapshot_pg_relation_size | table | postgres
pgperf | snapshot_pg_stat_activity | table | postgres
pgperf | snapshot_pg_stat_bgwriter | table | postgres
pgperf | snapshot_pg_stat_database | table | postgres
pgperf | snapshot_pg_stat_database_conflicts | table | postgres
pgperf | snapshot_pg_stat_replication | table | postgres
pgperf | snapshot_pg_stat_statements | table | postgres
pgperf | snapshot_pg_stat_user_indexes | table | postgres
pgperf | snapshot_pg_stat_user_tables | table | postgres
pgperf | snapshot_pg_statio_user_indexes | table | postgres
pgperf | snapshot_pg_statio_user_tables | table | postgres
pgperf | snapshot_pg_statistic | table | postgres
pgperf | snapshot_pgstatindex | table | postgres
pgperf | snapshot_pgstattuple | table | postgres
(17 rows)
testdb=#
â ã¹ãããã·ã§ããã®ååŸ
ããã§ã¯ãã€ã³ã¹ããŒã«ããPgPerfããã±ãŒãžã䜿ã£ãŠãçµ±èšæ å ±ã®ã¹ãããã·ã§ãããååŸããŠã¿ãŸãã
ã¹ãããã·ã§ãããååŸããã«ã¯ãpgpgerf.create_snapshot()ãšããSQL颿°ã䜿çšããŸãã
create_snapshot()颿°ã«ã¯ãã¹ãããã·ã§ããååŸã¬ãã«ãæå®ããå¿ èŠããããŸããã¹ãããã·ã§ããååŸã¬ãã«ã¯ããã®ããŒã¿ã®çš®å¥ãã¹ãããã·ã§ããååŸã«ãããè² è·ã«å¿ããŠããã£ãšãåºç€çãªã1ãããå¯èœãªéãã®æ å ±ãååŸããã5ããŸã§ã¬ãã«åãããããŠããŸãã
testdb=# SELECT pgperf.create_snapshot(1);
create_snapshot
-----------------
0
(1 row)
testdb=#
ããã§ã¯ããŸãã¯ãã£ãšãåºæ¬çãªã¹ãããã·ã§ããååŸã¬ãã«1ã§ååŸããŠã¿ãŸãã
â ååŸããã¹ãããã·ã§ããã®ç¢ºèª
ååŸããã¹ãããã·ã§ããã¯ãpgperfã¹ããŒãå ã«ãããsnapshot_ãã§å§ãŸãè€æ°ã®ããŒãã«ã«æ ŒçŽãããŸãã
pgperf.snapshotããŒãã«ã¯ãã¹ãããã·ã§ããååŸæå»ãšã¹ãããã·ã§ããIDã®å¯Ÿå¿ãä¿åããããŒãã«ã§ãããã®ããŒãã«ãåç §ãããšããã€ååŸããã¹ãããã·ã§ãããªã®ããã¹ãããã·ã§ããIDãäœçªãªã®ãããšãã£ãæ å ±ã確èªããããšãã§ããŸãã
åçš®çµ±èšæ å ±ã®ããŒã¿ãã®ãã®ã¯ããã®ä»ã®ãpgperf.snapshot_*ããšããããŒãã«ã«ä¿åãããŸãã
testdb=# SELECT * FROM pgperf.snapshot;
sid | ts
-----+----------------------------
0 | 2012-12-08 11:17:02.822046
(1 row)
testdb=#
äŸãã°ãããã¯ã°ã©ãŠã³ãã©ã€ã¿ã®çµ±èšæ å ±ãååŸã§ããpg_stat_bgwriterã·ã¹ãã ãã¥ãŒã®ã¹ãããã·ã§ããã¯pgperf.snapshot_pg_stat_bgwriterããŒãã«ã«ä¿åãããããšãã£ãä»çµã¿ã§ãã
詳现ã«ã€ããŠã¯ããŠãŒã¶ããã¥ã¢ã«ãåç §ããŠãã ããã
testdb=# SELECT * FROM pgperf.snapshot_pg_stat_bgwriter ;
-[ RECORD 1 ]---------+------------------------------
sid | 0
checkpoints_timed | 136
checkpoints_req | 35
buffers_checkpoint | 1746118
buffers_clean | 0
maxwritten_clean | 0
buffers_backend | 1383900
buffers_backend_fsync | 0
buffers_alloc | 451660
stats_reset | 2012-11-30 13:29:50.000083+09
testdb=#
PgPerfããã±ãŒãžãŠãŒã¶ãŒããã¥ã¢ã«
http://www.uptime.jp/go/pgperf-snapshot
â ã¹ãããã·ã§ããã®åé€
ã¹ãããã·ã§ãããåé€ããã«ã¯ãã¹ãããã·ã§ããIDãæå®ããŠpgperf.delete_snapshot()颿°ã䜿ããŸããæå®ããã¹ãããã·ã§ããIDã®ã¹ãããã·ã§ããããŒã¿ãããã¹ãŠã®ã¹ãããã·ã§ããããŒãã«ããäžæ¬ããŠåé€ããŠãããŸãã
testdb=# SELECT * FROM pgperf.snapshot;
sid | ts
-----+----------------------------
0 | 2012-12-08 11:17:02.822046
(1 row)
testdb=# SELECT pgperf.delete_snapshot(0);
delete_snapshot
-----------------
t
(1 row)
testdb=#
â ã¹ãããã·ã§ããã®æ¶ã蟌ã¿
åºæ¬çã«ã¹ãããã·ã§ããã®ããŒã¿ã¯èç©ããŠãããã®ã§ãããããäžå®ã®æé以äžçµéããå€ããã®ã¯åé€ããããããšãã£ãå ŽåããããšæããŸãããã®ãããªå Žåã«ã¯ãpgperf.purge_snapshots()颿°ã䜿ããŸãã
pgperf.purge_snapshots()颿°ã¯ãåŒæ°ã«INTERVALåã®å€ãåããæå®ããæéããå€ãã¹ãããã·ã§ãããäžæ¬ããŠåé€ããŸãã
以äžã®äŸã¯ãååŸããŠãã32æ¥ä»¥äžçµéããã¹ãããã·ã§ãããåé€ããŠããäŸã§ãã
testdb=# SELECT pgperf.purge_snapshots('32 days');
purge_snapshots
-----------------
12
(1 row)
testdb=#
â PgPerfããã±ãŒãžã®ã¢ã³ã€ã³ã¹ããŒã«
PgPerfããã±ãŒãžã¯ãPL/pgSQLã§äœæãããSQL颿°ãšããŒãã«é¡ã§æ§æãããŠããããã¹ãŠpgperfã¹ããŒãå ã«äœæãããŸãã
ã§ãã®ã§ãã¢ã³ã€ã³ã¹ããŒã«ããå Žåã«ã¯pgperfã¹ããŒããCASCADEæå®ã§DROPããããšã§ããããã«ã¢ã³ã€ã³ã¹ããŒã«ããããšãã§ããŸããpgperf_uninstall.sqlã¹ã¯ãªããã¯ããã®åŠçãè¡ã£ãŠãããŸãã
[snaga@devsv02 pgperf-snapshot]$ psql -U postgres -f pgperf_uninstall.sql testdb
psql:pgperf_uninstall.sql:1: NOTICE: drop cascades to 50 other objects
DETAIL: drop cascades to table pgperf.snapshot
drop cascades to function pgperf._get_server_version()
drop cascades to function pgperf._check_function(name)
(...snip...)
drop cascades to function pgperf.create_snapshot_pgstatindex(integer)
drop cascades to function pgperf.delete_snapshot_pgstatindex(integer)
DROP SCHEMA
[snaga@devsv02 pgperf-snapshot]$
â ãŸãšã
ä»åã¯ãPostgreSQLã®ããã©ãŒãã³ã¹çµ±èšæ å ±ãååŸã»èç©ããæ¹æ³ãšããŠãPgPerfããã±ãŒãžã®ç޹ä»ãšããã®åºæ¬çãªäœ¿ãæ¹ã®è§£èª¬ãããŸããã
PgPerfããã±ãŒãžã¯ãã€ã³ã¹ããŒã«ããã®ã䜿ã£ãŠã¿ãã®ãïŒãã¡ããã¢ã³ã€ã³ã¹ããŒã«ãïŒéåžžã«ç°¡åã§ãã®ã§ããã²è©ŠããŠã¿ãŠããã ããã°ãšæããŸãã
ææ¥ã¯ããã®PgPerfããã±ãŒãžã䜿ã£ãŠèç©ããã¹ãããã·ã§ããããŒã¿ããSQLã䜿ã£ãŠåæããæ¹æ³ã埡玹ä»ããŸãã
ã§ã¯ããŸãã