Alexey Lesovsky ã«ãã 2015 幎ã®ã¬ããŒããPostgreSQL ã®å éšçµ±èšã®è©³çŽ°ãã®è»¢å
ã¬ããŒãäœæè ããã®å 責äºé : ãã®ã¬ããŒãã®æ¥ä»ã¯ 2015 幎 4 æã§ããããšã«æ³šæããŠãã ããããã§ã« 9.4 幎以äžãçµéããããªãã®æéãçµéããŠããŸãã ã¬ããŒãã§èª¬æãããŠããããŒãžã§ã³ 4 ã¯ãµããŒããããªããªããŸããã éå» 5 幎é㧠XNUMX ã€ã®æ°ãããªãªãŒã¹ããªãªãŒã¹ãããçµ±èšã«é¢ããå€ãã®é©æ°ãæ¹åãå€æŽãè¡ãããŸããããäžéšã®è³æã¯å€ããªã£ãŠé¢é£æ§ããããŸããã ã¬ãã¥ãŒããéã«ãèªè ã誀解ãããªãããã«ããããã®å Žæã«ããŒã¯ãä»ããããã«ããŸããã ãããã®å Žæã¯ç§ãæžãçŽããããã§ã¯ãªãããããããããŸãããã®çµæããŸã£ããç°ãªãã¬ããŒããåŸãããŸãã
PostgreSQL DBMS ã¯å·šå€§ãªã¡ã«ããºã ã§ããããã®ã¡ã«ããºã ã¯å€ãã®ãµãã·ã¹ãã ã§æ§æãããŠããããã®èª¿æŽãããäœæ¥ã DBMS ã®ããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ããŸãã éçšäžã«ã³ã³ããŒãã³ãã®åäœã«é¢ããçµ±èšãæ
å ±ãåéããããããPostgreSQL ã®æå¹æ§ãè©äŸ¡ããããã©ãŒãã³ã¹ãåäžãããããã®å¯Ÿçãè¬ããããšãã§ããŸãã ãã ãããã®æ
å ±ã¯å€§éã«ãããããããªãç°¡ç¥åããã圢åŒã§è¡šç€ºãããŠããŸãã ãã®æ
å ±ãåŠçããŠè§£éããããšã¯ãå®å
šã«ç°¡åãªäœæ¥ã§ã¯ãªãå ŽåããããããŒã«ããŠãŒãã£ãªãã£ã®ãåç©åãã¯ãäžçŽ DBA ã§ãã£ãŠãç°¡åã«æ··ä¹±ããŠããŸãããšããããŸãã
ããã«ã¡ã¯ç§ã®ååã¯ã¢ã¬ã¯ã»ã€ã§ãã Ilya ãèšã£ãããã«ãPostgreSQL ã®çµ±èšã«ã€ããŠè©±ããŸãã
PostgreSQL ã¢ã¯ãã£ããã£ã®çµ±èšã PostgreSQL ã«ã¯ XNUMX ã€ã®çµ±èšããããŸãã ã¢ã¯ãã£ããã£çµ±èšã«ã€ããŠã¯åŸã§èª¬æããŸãã ããŒã¿åæ£ã«é¢ããã¹ã±ãžã¥ãŒã©ãŒçµ±èšã ç¹ã«ãããã©ãŒãã³ã¹ãå€æããäœããã®æ¹æ³ã§æ¹åã§ããããã«ãã PostgreSQL ã¢ã¯ãã£ããã£çµ±èšã«ã€ããŠèª¬æããŸãã
ããªããæ±ããŠããããŸãã¯æ±ããŠããå¯èœæ§ã®ããããŸããŸãªåé¡ã解決ããããã«çµ±èšãå¹æçã«äœ¿çšããæ¹æ³ã説æããŸãã
ã¬ããŒãã«èšèŒãããªããã®ã¯äœã§ãã? ã¬ããŒãã§ã¯ãã¹ã±ãžã¥ãŒã©ã®çµ±èšã«ã€ããŠã¯è§ŠããŸããã ããã¯ãããŒã¿ãããŒã¿ããŒã¹ã«ã©ã®ããã«ä¿åãããããããã³ã¯ãšãª ãã©ã³ããŒããã®ããŒã¿ã®å®æ§çããã³éçç¹æ§ã«ã€ããŠã©ã®ããã«ææ¡ãããã«ã€ããŠã®å¥ã®ã¬ããŒãã®å¥ã®ãããã¯ã§ãã
ãŸããããŒã«ã®ã¬ãã¥ãŒã¯ãããŸããããã補åãå¥ã®è£œåãšæ¯èŒããããšããããŸããã åºåã¯ãããŸããã èœãšããŠã¿ãŸãããã
çµ±èšã䜿ãããšã圹ã«ç«ã€ããšã瀺ããããšæããŸãã ããã¯å¿ èŠã§ããã æããã«äœ¿ã£ãŠãã ããã å¿ èŠãªã®ã¯ãåçŽãª SQL ãš SQL ã®åºæ¬çãªç¥èã ãã§ãã
ãããŠãåé¡ã解決ããããã«ã©ã®çµ±èšãéžæãããã«ã€ããŠèª¬æããŸãã
PostgreSQL ã調ã¹ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã äžã§ã³ãã³ããå®è¡ããŠããã»ã¹ã衚瀺ãããšãããã©ã㯠ããã¯ã¹ãã衚瀺ãããŸãã äœããå®è¡ããããã€ãã®ããã»ã¹ã衚瀺ãããååã«ãã£ãŠãããããããã§äœãããŠããã®ããäœãããŠããã®ãã倧ãŸãã«æ³åã§ããŸãã ããããå®éã«ã¯ãããã¯ãã©ãã¯ããã¯ã¹ã§ãããå éšãèŠãããšã¯ã§ããŸããã
CPU è² è·ã確èªã§ããŸãã top
ãäžéšã®ã·ã¹ãã ãŠãŒãã£ãªãã£ã§ã¡ã¢ãªäœ¿çšçã確èªã§ããŸãããPostgreSQL ã®å
éšã確èªããããšã¯ã§ããŸããã ãã®ããã«ã¯ä»ã®ããŒã«ãå¿
èŠã§ãã
ããã«ç¶ããŠãã©ãã«æéãããã£ãŠãããã説æããŸãã PostgreSQL ããã®ãããªã¹ããŒã ã®åœ¢ã§è¡šçŸãããšãã©ãã«æéãããã£ãŠããããçããããšãã§ããŸãã ããã㯠XNUMX ã€ã®ããšã§ããã¢ããªã±ãŒã·ã§ã³ããã®ã¯ã©ã€ã¢ã³ãèŠæ±ã®åŠçãšãPostgreSQL ãå®è¡ãç¶ããããã« PostgreSQL ãå®è¡ããããã¯ã°ã©ãŠã³ã ã¿ã¹ã¯ã§ãã
å·Šäžé ãèŠå§ãããšãã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ããã©ã®ããã«åŠçãããããããããŸãã ãªã¯ãšã¹ãã¯ã¢ããªã±ãŒã·ã§ã³ããéä¿¡ããããããªãäœæ¥ã®ããã«ã¯ã©ã€ã¢ã³ã ã»ãã·ã§ã³ãéãããŸãã ãªã¯ãšã¹ãã¯ã¹ã±ãžã¥ãŒã©ã«æž¡ãããŸãã ãã©ã³ããŒã¯ã¯ãšãª ãã©ã³ãäœæããŸãã ããã«å®è¡ã®ããã«éä¿¡ããŸãã ããŒãã«ãšã€ã³ããã¯ã¹ã«é¢é£ä»ããããããçš®ã®ããã㯠I/O ããŒã¿ããããŸãã å¿ èŠãªããŒã¿ã¯ãã£ã¹ã¯ãããå ±æãããã¡ããšåŒã°ããç¹å¥ãªé åã®ã¡ã¢ãªã«èªã¿èŸŒãŸããŸãã ã¯ãšãªçµæã¯ãæŽæ°ãåé€ã®å ŽåãWAL ã®ãã©ã³ã¶ã¯ã·ã§ã³ ãã°ã«èšé²ãããŸãã äžéšã®çµ±èšæ å ±ã¯ãã°ãŸãã¯çµ±èšã³ã¬ã¯ã¿ãŒã«ä¿åãããŸãã ãããŠããªã¯ãšã¹ãã®çµæãã¯ã©ã€ã¢ã³ãã«è¿ãããŸãã ãã®åŸãã¯ã©ã€ã¢ã³ãã¯æ°ãããªã¯ãšã¹ãã§ãã¹ãŠãç¹°ãè¿ãããšãã§ããŸãã
ããã¯ã°ã©ãŠã³ã ã¿ã¹ã¯ãšããã¯ã°ã©ãŠã³ã ããã»ã¹ã«ã¯äœãå«ãŸããŠããã®ã§ãããã? ããŒã¿ããŒã¹ãéåžžã®åäœã¢ãŒãã§çšŒåãç¶ããããã»ã¹ãããã€ããããŸãã ã¬ããŒãã§ã¯ãèªåããã¥ãŒã ããã§ãã¯ãã€ã³ãäœæè ãã¬ããªã±ãŒã·ã§ã³ã«é¢é£ããããã»ã¹ãããã¯ã°ã©ãŠã³ã ã©ã€ã¿ãŒãªã©ã®ããã»ã¹ã«ã€ããŠã説æããŸãã ããããã«ã€ããŠè§Šããªããã¬ããŒãããŠãããŸãã
çµ±èšã«ã¯ã©ã®ãããªåé¡ãããã®ã§ãããã?
- æ å ±ããããããããŸãã PostgreSQL 9.4 ã¯ãçµ±èšããŒã¿ã衚瀺ããããã® 109 ã®ã¡ããªã¯ã¹ãæäŸããŸãã ãã ããããŒã¿ããŒã¹ã«å€ãã®ããŒãã«ãã¹ããŒããããŒã¿ããŒã¹ãæ ŒçŽãããŠããå Žåã¯ãããããã¹ãŠã®ã¡ããªã¯ã¹ã«ã察å¿ããããŒãã«ãããŒã¿ããŒã¹ã®æ°ãä¹ç®ããå¿ èŠããããŸãã ã€ãŸããããã«å€ãã®æ å ±ããããŸãã ãããŠãããã«æººããŠããŸãã®ã¯ãšãŠãç°¡åã§ãã
- 次ã®åé¡ã¯ãçµ±èšãã«ãŠã³ã¿ãŒã§è¡šãããããšã§ãã ãããã®çµ±èšãèŠããšãã«ãŠã³ã¿ãŒãç¶ç¶çã«å¢å ããŠããããšãããããŸãã ãŸããçµ±èšããªã»ãããããŠããããªãã®æéãçµéãããšãæ°ååã®å€ã衚瀺ãããããšã«ãªããŸãã ãããŠåœŒãã¯ç§ãã¡ã«äœãæããŠãããŸããã
- æŽå²ã¯ãããŸããã 15 ïœ 30 ååã«äœããèœã¡ããªã©ãäœããã®é害ãçºçããå Žåãçµ±èšã䜿çšã㊠15 ïœ 30 ååã«äœãèµ·ãã£ããã確èªããããšã¯ã§ããŸããã ããã¯åé¡ã§ãã
- PostgreSQL ã«ããŒã«ãçµã¿èŸŒãŸããŠããªãããšãåé¡ã§ãã ã«ãŒãã«éçºè ã¯ãŠãŒãã£ãªãã£ãæäŸããŸããã 圌ãã«ã¯ãã®ãããªãã®ã¯äœããããŸããã 圌ãã¯ããŒã¿ããŒã¹å ã®çµ±èšãæäŸããã ãã§ãã ããã䜿ã£ãŠãããã«ãªã¯ãšã¹ããããŠãäœã§ãããŠãã ããã
- PostgreSQL ã«ã¯ããŒã«ãçµã¿èŸŒãŸããŠããªããããå¥ã®åé¡ãçºçããŸãã ãµãŒãããŒãã£ã®ããŒã«ããããããããŸãã å€ããå°ãªããçŽæ¥æãæ¡ã£ãŠãããã¹ãŠã®äŒæ¥ã¯ãç¬èªã®ããã°ã©ã ãäœæããããšããŠããŸãã ãã®çµæãã³ãã¥ããã£ã«ã¯çµ±èšãæ±ãããã«äœ¿çšã§ããããŒã«ãå€æ°ãããŸãã ãŸããäžéšã®ããŒã«ã«ã¯ããã€ãã®æ©èœããããä»ã®ããŒã«ã«ã¯ä»ã®æ©èœããªãããããã€ãã®æ°æ©èœããããŸãã ãããŠãç°ãªãæ©èœãæ〠XNUMX ã€ãXNUMX ã€ããŸã㯠XNUMX ã€ã®ããŒã«ãäºãã«éè€ããŠäœ¿çšããå¿ èŠãããç¶æ³ãçºçããŸãã ããã¯éåžžã«è¿·æã§ãã
ããããäœãèµ·ããã§ããããïŒ ããã°ã©ã ã«äŸåããã«çµ±èšãçŽæ¥ååŸã§ããããšãéèŠã§ãããŸãã¯ãäœããã®æ¹æ³ã§ãããã®ããã°ã©ã ãèªåã§æ¹åããå©ç¹ãåŸãããã«ããã€ãã®æ©èœãè¿œå ããããšãã§ããŸãã
ãŸããSQL ã®åºæ¬çãªç¥èãå¿ èŠã§ãã çµ±èšããããŒã¿ãååŸããã«ã¯ãSQL ã¯ãšãªãäœæããå¿ èŠããããŸããã€ãŸããéžæãšçµåãã©ã®ããã«è¡ãããããç¥ãå¿ èŠããããŸãã
çµ±èšã¯ããã€ãã®ããšãæããŠãããŸãã ãããã¯ã«ããŽãªã«åé¡ã§ããŸãã
- æåã®ã«ããŽãªã¯ãããŒã¿ããŒã¹å ã§çºçããã€ãã³ãã§ãã ããã¯ãããŒã¿ããŒã¹å ã§äœããã®ã€ãã³ããçºçãããšãã§ããã¯ãšãªãããŒãã« ã¢ã¯ã»ã¹ãèªåããã¥ãŒã ãã³ããããªã©ããããã¯ãã¹ãŠã€ãã³ãã§ãã ãããã®ã€ãã³ãã«å¯Ÿå¿ããã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããŸãã ãããŠããããã®ã€ãã³ãã远跡ããããšãã§ããŸãã
- XNUMX çªç®ã®ã«ããŽãªã¯ãããŒãã«ãããŒã¿ããŒã¹ãªã©ã®ãªããžã§ã¯ãã®ããããã£ã§ãã ãããã«ã¯ç¹æ§ããããŸãã ããã¯ããŒãã«ã®ãµã€ãºã§ãã ããŒãã«ã®å¢å ãã€ã³ããã¯ã¹ã®å¢å ã远跡ã§ããŸãã ãã€ããã¯ã¹ã®å€åãããããŸãã
- XNUMX çªç®ã®ã«ããŽãªã¯ãã€ãã³ãã«è²»ããããæéã§ãã ãªã¯ãšã¹ãã¯ã€ãã³ãã§ãã ç¬èªã®æéã®å°ºåºŠããããŸãã ããã§å§ãŸããããã§çµãããŸããã 远跡ã§ããŸãã ãã£ã¹ã¯ããã®ãããã¯ã®èªã¿åãæãŸãã¯æžã蟌ã¿æã ãããã£ããã®ã远跡ãããŸãã
çµ±èšã®ãœãŒã¹ã¯æ¬¡ã®ããã«è¡šç€ºãããŸãã
- å ±æã¡ã¢ãª (å ±æãããã¡) ã«ã¯ãéçããŒã¿ãé 眮ããããã®ã»ã°ã¡ã³ãããããç¹å®ã®ã€ãã³ããçºçããããããŒã¿ããŒã¹ã®æäœäžã«çºçããç¬éã«åžžã«å¢å ããã«ãŠã³ã¿ããããŸãã
- ãããã®ã«ãŠã³ã¿ãŒã¯ãã¹ãŠããŠãŒã¶ãŒã¯äœ¿çšã§ããã管çè ã䜿çšã§ããŸããã ãããã¯äœã¬ãã«ã®ããšã§ãã ãããã«ã¢ã¯ã»ã¹ããããã«ãPostgreSQL 㯠SQL é¢æ°ã®åœ¢åŒã§ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã ãããã®é¢æ°ã䜿çšããŠéžæãè¡ããããçš®ã®ã¡ããªã¯ã¹ (ãŸãã¯ã¡ããªã¯ã¹ã®ã»ãã) ãååŸã§ããŸãã
- ãã ãããããã®é¢æ°ã䜿çšãããšå¿ ããã䟿å©ã§ãããšã¯éããªããããé¢æ°ã¯ãã¥ãŒ (VIEW) ã®åºç€ãšãªããŸãã ãããã¯ãç¹å®ã®ãµãã·ã¹ãã ããŸãã¯ããŒã¿ããŒã¹å ã®äžé£ã®ã€ãã³ãã«é¢ããçµ±èšãæäŸããä»®æ³ããŒãã«ã§ãã
- ãããã®çµã¿èŸŒã¿ãã¥ãŒ (VIEW) ã¯ãçµ±èšãæäœããããã®äž»èŠãªãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ãããã¯è¿œå ã®èšå®ãè¡ããã«ããã©ã«ãã§å©çšå¯èœã§ãããããã«äœ¿çšããããç£èŠããããããããæ å ±ãååŸãããã§ããŸãã ãããŠæçš¿è ãããŸãã æçš¿ã¯å ¬åŒã®ãã®ã§ãã postgresql-contrib ããã±ãŒãž (postgresql94-contrib ãªã©) ãã€ã³ã¹ããŒã«ããå¿ èŠãªã¢ãžã¥ãŒã«ãæ§æã«ããŒããããã©ã¡ãŒã¿ãæå®ã㊠PostgreSQL ãåèµ·åãããšã䜿çšã§ããããã«ãªããŸãã ïŒããŒãã ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠã¯ãcontrib ã®æè¿ã®ããŒãžã§ã³ã§ã¯ãããã±ãŒãžã¯ã¡ã€ã³ ããã±ãŒãžã®äžéšã§ãã).
- ãããŠéå ¬åŒã®æçš¿ããããŸãã ãããã¯æšæºã® PostgreSQL ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ä»å±ããŠããŸããã ãããã¯ã³ã³ãã€ã«ããããã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ãã®éå ¬åŒæçš¿ã®éçºè ãäœãæãã€ãããã«ãã£ãŠããªãã·ã§ã³ã¯å€§ããç°ãªãå ŽåããããŸãã
ãã®ã¹ã©ã€ãã§ã¯ãPostgreSQL 9.4 ã§äœ¿çšã§ãããã¹ãŠã®ãã¥ãŒ (VIEW) ãšããã€ãã®é¢æ°ã瀺ããŸãã ã芧ã®ãšããããããã¯ãããããããŸãã ãããŠãåããŠçµéšããå Žåã¯æ··ä¹±ããã®ã¯éåžžã«ç°¡åã§ãã
ããããå
ã»ã©ã®åçãæ®ã£ãŠã¿ããšã Ðак ÑÑаÑОÑÑÑ Ð²ÑÐµÐŒÑ ÐœÐ° PostgreSQL
ãã®ãªã¹ããšäžèŽãããšã次ã®å³ãåŸãããŸãã PostgreSQL ãå®è¡ããŠããå Žåãåãã¥ãŒ (VIEW) ãŸãã¯åé¢æ°ãäœããã®ç®çã§äœ¿çšããŠãé©åãªçµ±èšãååŸã§ããŸãã ãããŠããµãã·ã¹ãã ã®åäœã«é¢ããæ
å ±ããã§ã«ååŸã§ããŠããŸãã
ãŸãæåã«èŠãŠãããŸãã pg_stat_database
ã ã芧ã®ãšãããããã¯è¡šçŸã§ãã ããããã®æ
å ±ãå«ãŸããŠããŸãã æãå€æ§ãªæ
å ±ã ãããŠãããŒã¿ããŒã¹å
ã§äœãèµ·ãã£ãŠãããã«ã€ããŠã®éåžžã«åœ¹ç«ã€ç¥èãæäŸããŸãã
ããããäœãåŸãããã§ããããïŒ æãåçŽãªããšããå§ããŸãããã
select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;
ãŸãæåã«ç¢ºèªã§ããã®ã¯ããã£ãã·ã¥ ãããçã§ãã ãã£ãã·ã¥ ãããçã¯æçšãªææšã§ãã ããã«ãããå ±æãããã¡ ãã£ãã·ã¥ããååŸãããããŒã¿ã®éãšããã£ã¹ã¯ããèªã¿åãããããŒã¿ã®éãèŠç©ããããšãã§ããŸãã
ããã¯æããã§ã ãã£ãã·ã¥ããããå€ããã°å€ãã»ã©è¯ãã ãã®ææšã¯ããŒã»ã³ããŒãžãšããŠè©äŸ¡ãããŸãã ãããŠãããšãã°ããããã®ãã£ãã·ã¥ ãããã®å²åã 90% ãè¶ ããŠããã°ãããã¯è¯å¥œã§ãã 90% ãäžåãå Žåã¯ãããŒã¿ã®ãããããããã¡ã¢ãªå ã«ä¿æããã®ã«ååãªã¡ã¢ãªããããŸããã ãããŠããã®ããŒã¿ã䜿çšããããã«ãPostgreSQL ã¯ãã£ã¹ã¯ã«ã¢ã¯ã»ã¹ããå¿ èŠããããããã¯ããŒã¿ãã¡ã¢ãªããèªã¿åãããå Žåãããé ããªããŸãã ãããŠãã¡ã¢ãªã®å¢å ã«ã€ããŠèããå¿ èŠããããŸããå ±æãããã¡ãå¢ããããéã®ã¡ã¢ãª (RAM) ãå¢ãããã®ããããã§ãã
select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;
ãã®ããã©ãŒãã³ã¹ããä»ã«äœãåŸãããã§ããããïŒ ããŒã¿ããŒã¹å ã§çºçããŠããç°åžžã確èªã§ããŸãã ããã«ã¯äœã衚瀺ãããŠããŸãã? ã³ããããããŒã«ããã¯ãäžæãã¡ã€ã«ã®äœæããã®ãµã€ãºããããããã¯ã競åãªã©ãçºçããŸãã
ãã®ãªã¯ãšã¹ãã䜿çšã§ããŸãã ãã® SQL ã¯éåžžã«åçŽã§ãã ãããŠç§ãã¡ã¯ãã®ããŒã¿ãèªåèªèº«ã§èŠãããšãã§ããŸãã
ãããŠããããéŸå€ã§ãã ã³ããããšããŒã«ããã¯ã®æ¯çã調ã¹ãŸãã ã³ããããšã¯ããã©ã³ã¶ã¯ã·ã§ã³ãæåããããšã確èªããããšã§ãã ããŒã«ããã¯ã¯ããŒã«ããã¯ã§ããã€ãŸãããã©ã³ã¶ã¯ã·ã§ã³ãäœããã®äœæ¥ãè¡ããããŒã¿ããŒã¹ã«è² æ ããããäœããæ€èšããåŸãé害ãçºçãããã©ã³ã¶ã¯ã·ã§ã³ã®çµæã¯ç Žæ£ãããŸãã ã€ãŸã ããŒã«ããã¯ã®æ°ãå¢ãç¶ããã®ã¯åé¡ã§ãã ãããŠãäœããã®æ¹æ³ã§ããããåé¿ãããããèµ·ãããªãããã«ã³ãŒããç·šéããå¿ èŠããããŸãã
競åã¯ã¬ããªã±ãŒã·ã§ã³ã«é¢é£ããŠããŸãã ãããŠããããé¿ããã¹ãã§ãã ã¬ããªã«äžã§å®è¡ãããã¯ãšãªãããã競åãçºçããå Žåã¯ããããã®ç«¶åãåæããŠãäœãèµ·ãã£ããã確èªããå¿ èŠããããŸãã 詳现ã¯ãã°ã§ç¢ºèªã§ããŸãã ãŸãã競åç¶æ³ã解決ããŠãã¢ããªã±ãŒã·ã§ã³ã®ãªã¯ãšã¹ãããšã©ãŒãªãã§æ©èœããããã«ããŸãã
ãããããã¯ãæªãç¶æ³ã§ãã ãªã¯ãšã¹ãããªãœãŒã¹ãããã£ãŠç«¶åããå ŽåãXNUMX ã€ã®ãªã¯ãšã¹ã㯠XNUMX ã€ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããŠããã¯ãååŸããXNUMX çªç®ã®ãªã¯ãšã¹ã㯠XNUMX çªç®ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããŠããã¯ãååŸãããã®åŸãäž¡æ¹ã®ãªã¯ãšã¹ããäºãã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããé£æ¥ãããªã¯ãšã¹ããããã¯ã解æŸããã®ãåŸ ã£ãŠãããã¯ãããŸãã ãããåé¡ã®ããç¶æ³ã§ãã ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®æžãæããšãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã®ã·ãªã¢ã«åã®ã¬ãã«ã§å¯ŸåŠããå¿ èŠããããŸãã ãããããã¯ãç¶ç¶çã«å¢å ããŠããããšãããã£ãå Žåã¯ããã°ã®è©³çŽ°ã確èªããçºçããç¶æ³ãåæããŠãäœãåé¡ãªã®ãã確èªããå¿ èŠããããŸãã
äžæãã¡ã€ã« (temp_files) ããã¡ã§ãã ãŠãŒã¶ãŒèŠæ±ã«ãéçšäžã®äžæããŒã¿ãå容ããã®ã«ååãªã¡ã¢ãªããªãå Žåããã£ã¹ã¯äžã«ãã¡ã€ã«ãäœæãããŸãã ãããŠãã¡ã¢ãªå ã®äžæãããã¡ãŒã§å®è¡ã§ãããã¹ãŠã®æäœã¯ããã§ã«ãã£ã¹ã¯äžã§å®è¡ããå§ããŠããŸãã é ãã§ããã ããã«ãããã¯ãšãªã®å®è¡æéãå¢å ããŸãã ãããŠãPostgreSQL ã«ãªã¯ãšã¹ããéä¿¡ããã¯ã©ã€ã¢ã³ãã¯ãå°ãé ããŠã¬ã¹ãã³ã¹ãåãåããŸãã ããããã¹ãŠã®æäœãã¡ã¢ãªå ã§å®è¡ãããå ŽåãPostgres ã®å¿çã¯ã¯ããã«éããªããã¯ã©ã€ã¢ã³ãã®åŸ ã¡æéã¯çããªããŸãã
pg_stat_bgwriter - ãã®ãã¥ãŒã¯ãXNUMX ã€ã® PostgreSQL ããã¯ã°ã©ãŠã³ã ãµãã·ã¹ãã ã®åäœã説æããŸãã checkpointer
О background writer
.
ãŸããã³ã³ãããŒã« ãã€ã³ããããããã³ã³ãããŒã« ãã€ã³ããåæããŸãããã checkpoints
ã ãã§ãã¯ãã€ã³ããšã¯äœã§ãã? ãã§ãã¯ãã€ã³ãã¯ããã°å
ã§ã³ãããããããã¹ãŠã®ããŒã¿å€æŽããã£ã¹ã¯äžã®ããŒã¿ãšæ£åžžã«åæãããŠããããšã瀺ããã©ã³ã¶ã¯ã·ã§ã³ ãã°å
ã®äœçœ®ã§ãã ãã®ããã»ã¹ã¯ã¯ãŒã¯ããŒããšèšå®ã«ãã£ãŠã¯æéããããå Žåããããã»ãšãã©ã®å Žåãå
±æãããã¡å
ã®ããŒã㣠ããŒãžãšãã£ã¹ã¯äžã®ããŒã¿ ãã¡ã€ã«ãåæããããšã§æ§æãããŸãã ããã¯ãªãã®ããã§ããïŒ PostgreSQL ãåžžã«ãã£ã¹ã¯ã«ã¢ã¯ã»ã¹ããŠããããããŒã¿ãååŸããã¢ã¯ã»ã¹ãããã³ã«ããŒã¿ãæžã蟌ããšãé床ãé
ããªããŸãã ãããã£ãŠãPostgreSQL ã«ã¯ã¡ã¢ãª ã»ã°ã¡ã³ããããããã®ãµã€ãºã¯æ§æå
ã®ãã©ã¡ãŒã¿ã«ãã£ãŠç°ãªããŸãã Postgres ã¯ããããªãåŠçãã¯ãšãªã®ããã«ãã®ã¡ã¢ãªã«éçšããŒã¿ãå²ãåœãŠãŸãã ããŒã¿å€æŽãªã¯ãšã¹ãã®å Žåã¯å€æŽãããŸãã ãããŠãXNUMX ã€ã®ããŒãžã§ã³ã®ããŒã¿ãååŸããŸãã XNUMX ã€ã¯ã¡ã¢ãªäžã«ããããã XNUMX ã€ã¯ãã£ã¹ã¯äžã«ãããŸãã ãããŠããã®ããŒã¿ãå®æçã«åæããå¿
èŠããããŸãã ã¡ã¢ãªå
ã§å€æŽãããå
容ããã£ã¹ã¯ã«åæããå¿
èŠããããŸãã ããã«ã¯ãã§ãã¯ãã€ã³ããå¿
èŠã§ãã
ãã§ãã¯ãã€ã³ãã¯å ±æãããã¡ãééãããã§ãã¯ãã€ã³ãã«å¿ èŠãªããŒã㣠ããŒãžã«ããŒã¯ãä»ããŸãã 次ã«ãå ±æãããã¡ãŒãä»ãã XNUMX çªç®ã®ãã¹ãéå§ããŸãã ãããŠããã§ãã¯ãã€ã³ããšããŠããŒã¯ãããããŒãžã¯ããã§ã«åæãããŠããŸãã ãããã£ãŠãããŒã¿ã¯ãã§ã«ãã£ã¹ã¯ãšåæãããŠããŸãã
å¶åŸ¡ç¹ã«ã¯ XNUMX çš®é¡ãããŸãã ã¿ã€ã ã¢ãŠãæã« XNUMX ã€ã®ãã§ãã¯ãã€ã³ããå®è¡ãããŸãã ãã®ãã§ãã¯ãã€ã³ãã¯äŸ¿å©ã§è¯ããã®ã§ã - checkpoint_timed
ã ãªã³ããã³ãã®ãã§ãã¯ãã€ã³ãããããŸã - checkpoint required
ã ãã®ãããªãã§ãã¯ãã€ã³ãã¯ãéåžžã«å€§ããªããŒã¿ ã¬ã³ãŒããããå Žåã«çºçããŸãã 倧éã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãèšé²ããŸããã ãã㊠PostgreSQL ã¯ãããããã¹ãŠãã§ããã ãæ©ãåæãããã§ãã¯ãã€ã³ããäœæããŠæ¬¡ã«é²ãå¿
èŠããããšèããŠããŸãã
ãããŠçµ±èšãèŠãŠã¿ããš pg_stat_bgwriter
ãããŠããªããæã£ãŠãããã®ãèŠãŠãã ãã checkpoint_reqãcheckpoint_timedãããã¯ããã«å€§ããå Žåãããã¯åé¡ã§ãã ã©ãããŠæªãã®ã§ããïŒ ããã¯ãPostgreSQL ããã£ã¹ã¯ã«ããŒã¿ãæžã蟌ãå¿
èŠããããšãã«ãç¶ç¶çãªã¹ãã¬ã¹ã«ãããããŠããããšãæå³ããŸãã ã¿ã€ã ã¢ãŠãã«ãããã§ãã¯ãã€ã³ãã¯ã¹ãã¬ã¹ãå°ãªããå
éšã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠå®è¡ãããããã°æéã®çµéãšãšãã«å®è¡ãããŸãã PostgreSQL ã«ã¯ããã£ã¹ã¯ ãµãã·ã¹ãã ã«è² æ
ããããã«äœæ¥ãäžæåæ¢ããæ©èœããããŸãã ããã¯PostgreSQLã«äŸ¿å©ã§ãã ãŸãããã§ãã¯ãã€ã³ãäžã«å®è¡ããããªã¯ãšã¹ãã¯ããã£ã¹ã¯ ãµãã·ã¹ãã ãããžãŒã§ãããšããäºå®ã«ããã¹ãã¬ã¹ãåããŸããã
ãã§ãã¯ãã€ã³ãã調æŽããã«ã¯ XNUMX ã€ã®ãã©ã¡ãŒã¿ããããŸãã
-
Ñheckpoint_segments
. -
Ñheckpoint_timeout
. -
Ñheckpoint_competion_target
.
ãããã䜿çšãããšãã³ã³ãããŒã« ãã€ã³ãã®æäœãå¶åŸ¡ã§ããŸãã ããããç§ã¯ãããã«ãã ããã€ããã¯ãããŸããã 圌ãã®åœ±é¿åã¯å¥ã®åé¡ã§ãã
èŠåïŒ ã¬ããŒãã§èæ
®ãããŠããããŒãžã§ã³ 9.4 ã¯ããã¯ãé¢é£æ§ããããŸããã PostgreSQL ã®ææ°ããŒãžã§ã³ã§ã¯ããã©ã¡ãŒã¿ checkpoint_segments
ãã©ã¡ãŒã¿ã«çœ®ãæãããã min_wal_size
О max_wal_size
.
次ã®ãµãã·ã¹ãã ã¯ããã¯ã°ã©ãŠã³ãã©ã€ã¿ãŒã§ã- background writer
ã 圌ã¯äœãããŠããã®ïŒ åžžã«ç¡éã«ãŒãã§å®è¡ãããŸãã ããŒãžãå
±æãããã¡ã«ã¹ãã£ã³ããèŠã€ãã£ãããŒã㣠ããŒãžããã£ã¹ã¯ã«ãã©ãã·ã¥ããŸãã ãã®ããã«ããŠããã§ãã¯ãã€ã³ãäœæè
ããã§ãã¯ãã€ã³ãäœæäžã«è¡ãäœæ¥ãæžããããšãã§ããŸãã
圌ã¯ä»ã«äœã®å¿
èŠãããã®ã§ããããïŒ ããã«ãããããŒã¿ãå容ããããã«å
±æãããã¡ãŒã«ã¯ãªãŒã³ãªããŒãžãçªç¶ (倧éãã€å³æã«) å¿
èŠã«ãªã£ãå Žåã«åããŠãã¯ãªãŒã³ãªããŒãžãå¿
èŠã«ãªããŸãã ãªã¯ãšã¹ãã«ã¯ãªãŒã³ãªããŒãžãå¿
èŠã§ããããã®ããŒãžããã§ã«å
±æãããã¡ãŒã«ãããšããç¶æ³ãçºçãããšããŸãã ãã¹ãã°ã¬ backend
圌ã¯ããããåãåºããŠäœ¿çšããã ãã§ãèªåã§äœããæé€ããå¿
èŠã¯ãããŸããã ããããçªç¶ãã®ãããªããŒãžããªããªããšãããã¯ãšã³ãã¯äžæåæ¢ããŠããŒãžã®æ€çŽ¢ãéå§ããããŒãžããã£ã¹ã¯ã«ãã©ãã·ã¥ããŠç¬èªã®å¿
èŠã«å¿ããŠååŸããŸããããã¯ãçŸåšå®è¡äžã®ãªã¯ãšã¹ãã®æéã«æªåœ±é¿ãåãŒããŸãã ãã©ã¡ãŒã¿ãããããšãããã£ãå Žå maxwritten_clean
倧ããå Žåãããã¯ããã¯ã°ã©ãŠã³ã ã©ã€ã¿ãŒããã®ä»äºãè¡ã£ãŠããªãããããã©ã¡ãŒã¿ãŒãå¢ããå¿
èŠãããããšãæå³ããŸãã bgwriter_lru_maxpages
XNUMX ãµã€ã¯ã«ã§ããå€ãã®äœæ¥ãå®è¡ã§ããããã«ãããå€ãã®ããŒãžãã¯ãªã¢ããŸãã
ãããŠããã XNUMX ã€ã®éåžžã«äŸ¿å©ãªææšã¯ã buffers_backend_fsync
. ããã¯ãšã³ãã¯é
ããã fsync ãå®è¡ããŸããã ããã㯠fsync ã IO ã¹ã¿ã㯠ãã§ãã¯ãã€ã³ãã«æž¡ããŸãã ãã§ãã¯ãã€ã³ã¿ã«ã¯ç¬èªã®ãã¥ãŒããããå®æçã« fsync ãåŠçããã¡ã¢ãªå
ã®ããŒãžããã£ã¹ã¯äžã®ãã¡ã€ã«ãšåæããŸãã ãã§ãã¯ãã€ã³ã¿ã®ãã¥ãŒã倧ãããŠãã£ã±ãã®å Žåãããã¯ãšã³ãã¯åŒ·å¶çã« fsync èªäœãå®è¡ããããšã«ãªããããã¯ãšã³ãã®é床ãäœäžããŸããã€ãŸããã¯ã©ã€ã¢ã³ãã¯å¿çãåä¿¡ã§ãããããé
ããªããŸãã ãã®å€ããŒããã倧ããããšãããã£ãå Žåãããã¯ãã§ã«åé¡ãšãªã£ãŠããã ããã¯ã°ã©ãŠã³ã ã©ã€ã¿ã®èšå®ã«æ³šæãæãããã£ã¹ã¯ ãµãã·ã¹ãã ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããå¿
èŠããããŸãã
èŠåïŒ _次ã®ããã¹ãã§ã¯ãã¬ããªã±ãŒã·ã§ã³ã«é¢é£ããçµ±èšãã¥ãŒã«ã€ããŠèª¬æããŸãã Postgres 10 ã§ã¯ãã»ãšãã©ã®ãã¥ãŒåãšé¢æ°åã®ååãå€æŽãããŸãããååå€æŽã®æ¬è³ªã¯ã xlog
Ма wal
О location
Ма lsn
é¢æ°/ãã¥ãŒåãªã©ç¹å®ã®äŸãæ©èœ pg_xlog_location_diff()
ååãå€æŽãããŸãã pg_wal_lsn_diff()
._
ããã«ããããããããŸãã ãã ããå¿ èŠãªã®ã¯å Žæã«é¢é£ããé ç®ã ãã§ãã
ãã¹ãŠã®å€ãçããå Žåãããã¯çæ³çã§ãããã¬ããªã«ã¯ãã¹ã¿ãŒã«é ãããšã£ãŠããŸããã
ããã§ã® XNUMX é²æ°ã®äœçœ®ã¯ããã©ã³ã¶ã¯ã·ã§ã³ ãã°å ã®äœçœ®ã§ãã ããŒã¿ããŒã¹å ã«æ¿å ¥ãåé€ãªã©ã®ã¢ã¯ãã£ããã£ãããå Žåããã®å€ã¯åžžã«å¢å ããŸãã
ÑкПлÑкП запОÑаМП xlog в байÑаÑ
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
лаг ÑеплОкаÑОО в байÑаÑ
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
лаг ÑеплОкаÑОО в ÑекÑМЎаÑ
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());
ããããç°ãªãå Žåã¯ãäœããã®é ããçããŸãã ã©ã°ã¯ãã¹ã¿ãŒããã®ã¬ããªã«ã®é ãã§ããã€ãŸããããŒã¿ã¯ãµãŒããŒéã§ç°ãªããŸãã
é 延ã®çç±ã¯æ¬¡ã® XNUMX ã€ã§ãã
- ãã¡ã€ã«åææžã蟌ã¿ãåŠçã§ããªãã®ã¯ãã£ã¹ã¯ ãµãã·ã¹ãã ã§ãã
- ãããã¯ãããŒã¿ãã¬ããªã«ã«å°éããæéããªããããŒã¿ãåçŸã§ããªãå Žåã«ããããã¯ãŒã¯ ãšã©ãŒãŸãã¯ãããã¯ãŒã¯éè² è·ãçºçããå¯èœæ§ããããŸãã
- ãããŠããã»ããµãŒã ããã»ããµãŒã¯éåžžã«ãŸããªã±ãŒã¹ã§ãã ç§ããã®ãããªå Žé¢ãXNUMXãXNUMX床èŠãŸããããããããããšãèµ·ããåŸãã®ã§ãã
ãããŠãçµ±èšã䜿çšã§ããããã«ãã XNUMX ã€ã®ã¯ãšãªã次ã«ç€ºããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ ãã°ã«èšé²ãããéãèŠç©ããããšãã§ããŸãã ãããªæ©èœãããã§ãã pg_xlog_location_diff
ã¬ããªã±ãŒã·ã§ã³ã®é
延ããã€ããšç§ã§èŠç©ããããšãã§ããŸãã ããã«ã¯ããã®ãã¥ãŒ (VIEW) ã®å€ã䜿çšããŸãã
泚æïŒ _pg_xlog_location ã®ä»£ããã«diff() é¢æ°ã§ã¯ãæžç®æŒç®åã䜿çšããŠãããäœçœ®ãå¥ã®äœçœ®ããæžç®ã§ããŸãã å¿«é©ã
ç§åäœã®é ãããããšãäžç¬ãååšããŸãã ãã¹ã¿ãŒã«ã¢ã¯ãã£ããã£ããªãå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯çŽ 15 ååã«ååšããŠããŠã¢ã¯ãã£ããã£ã¯ãããŸãããã¬ããªã«ã§ãã®ã©ã°ãèŠããšã15 åã®ã©ã°ãããããŸãã ããã¯èŠããŠãããŠæã¯ãããŸããã ãããŠããã®é ããèŠãŠãããšãåç¶ãšããŠããŸãå¯èœæ§ããããŸãã
pg_stat_all_tables ã䟿å©ãªãã¥ãŒã§ãã ããŒãã«ã®çµ±èšã衚瀺ããŸãã ããŒã¿ããŒã¹å ã«ããŒãã«ããããããã«äŒŽãäœããã®ã¢ã¯ãã£ããã£ãã¢ã¯ã·ã§ã³ãååšããå Žåããã®ãã¥ãŒãããã®æ å ±ãååŸã§ããŸãã
select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;
ãŸãæåã«æ³šç®ããã®ã¯ãé 次ããŒãã« ã¹ãã£ã³ã§ãã ãããã®æç« ã®åŸã®æ°åèªäœã¯å¿ ãããæªããã®ã§ã¯ãªãããã§ã«äœããããå¿ èŠãããããšã瀺ããŠããããã§ã¯ãããŸããã
ãã ãã1 çªç®ã®ã¡ããªã¯ã¹ãseq_tup_read ããããŸãã ããã¯ãé 次ã¹ãã£ã³ããè¿ãããè¡æ°ã§ãã å¹³åæ°ã 000ã10ã000ã50 ãè¶ ããå Žåãããã¯ãã§ã«ãã¢ã¯ã»ã¹ãã€ã³ããã¯ã¹ã«ãã£ãŠè¡ãããããã«ã©ããã«ã€ã³ããã¯ã¹ãæ§ç¯ããå¿ èŠãããå¯èœæ§ãããããšã瀺ããŠããŸãããŸãã¯ããã®ãããªé 次ã¹ãã£ã³ã䜿çšããã¯ãšãªãæé©åããŠããããªããšã¯èµ·ãããªãã
ç°¡åãªäŸãšããŠã倧ã㪠OFFSET ãš LIMIT ãå«ããªã¯ãšã¹ãã«äŸ¡å€ããããšããŸãã ããšãã°ãããŒãã«å ã® 100 è¡ãã¹ãã£ã³ããããã®åŸå¿ èŠãª 000 è¡ãååŸããã以åã«ã¹ãã£ã³ãããè¡ã¯ç Žæ£ãããŸãã ãããæªãã±ãŒã¹ã§ãã ãããŠããã®ãããªãªã¯ãšã¹ãã¯æé©åããå¿ èŠããããŸãã ãããŠããããèŠãŠãåãåã£ãæ°å€ãè©äŸ¡ã§ããåçŽãª SQL ã¯ãšãªã次ã«ç€ºããŸãã
select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;
ããŒãã« ãµã€ãºã¯ããã®ããŒãã«ãšè¿œå é¢æ°ã䜿çšããŠååŸããããšãã§ããŸãã pg_total_relation_size()
, pg_relation_size()
.
äžè¬ã«ãã¡ã¿ã³ãã³ãããããŸã dt
О di
ãPSQL ã§äœ¿çšã§ããããŒãã«ãšã€ã³ããã¯ã¹ã®ãµã€ãºã確èªã§ããŸãã
ãã ããé¢æ°ã䜿çšãããšãã€ã³ããã¯ã¹ãèæ ®ããŠãããŸãã¯ã€ã³ããã¯ã¹ãèæ ®ããã«ããŒãã«ã®ãµã€ãºã確èªããããŒã¿ããŒã¹ã®æé·ã«åºã¥ããŠãã€ãŸããããŒã¿ããŒã¹ãã©ã®ããã«æé·ãããããã§ã«æšå®ããã®ã«åœ¹ç«ã¡ãŸããã©ã®ãããªåŒ·åºŠã§ãããããããŠãµã€ãžã³ã°ã®æé©åã«ã€ããŠãã§ã«ããã€ãã®çµè«ãå°ãåºããŠããŸãã
ã¢ã¯ãã£ããã£ãæžã蟌ã¿ãŸãã ã¬ã³ãŒããšã¯äœã§ãã? æäœãèŠãŠã¿ãŸããã UPDATE
â ããŒãã«å
ã®è¡ãæŽæ°ããæäœã å®éãæŽæ°ã«ã¯ XNUMX ã€ã®æäœ (ãŸãã¯ãã以äž) ãå¿
èŠã§ãã ããã¯ãæ°ããè¡ããŒãžã§ã³ãæ¿å
¥ããå€ãè¡ããŒãžã§ã³ãå»æ¢ãšããŠããŒã¯ããŸãã åŸã§ãautovacuum ãæ¥ãŠããããã®å€ãããŒãžã§ã³ã®è¡ãåé€ãããã®å Žæãåå©çšå¯èœãšããŠããŒã¯ããŸãã
ãŸããæŽæ°ã¯ããŒãã«ãæŽæ°ããã ãã§ã¯ãããŸããã ãŸã ã€ã³ããã¯ã¹æŽæ°äžã§ãã ããŒãã«ã«å€æ°ã®ã€ã³ããã¯ã¹ãããå ŽåãæŽæ°ã§ã¯ãã¯ãšãªã§æŽæ°ããããã£ãŒã«ããåå ãããã¹ãŠã®ã€ã³ããã¯ã¹ãæŽæ°ããå¿ èŠããããŸãã ãããã®ã€ã³ããã¯ã¹ã«ã¯ãã¯ãªãŒã³ã¢ãããå¿ èŠãªå€ãè¡ããŒãžã§ã³ãå«ãŸããŸãã
select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;
ãŸãããã®èšèšã«ãããUPDATE ã¯è² è·ã®é«ãæäœã§ãã ãããããã£ãšç°¡åã«ããããšã¯ã§ããŸãã é£ã¹ã hot updates
ã ããã㯠PostgreSQL ããŒãžã§ã³ 8.3 ã§ç»å ŽããŸããã ãããŠãããã¯äœã§ããïŒ ããã¯ãã€ã³ããã¯ã¹ã®åæ§ç¯ãè¡ããªã軜éã®æŽæ°ã§ãã ã€ãŸããã¬ã³ãŒããæŽæ°ããŸããããããŒãžå
ã®ã¬ã³ãŒã (ããŒãã«ã«å±ãã) ã®ã¿ãæŽæ°ãããã€ã³ããã¯ã¹ã¯äŸç¶ãšããŠããŒãžå
ã®åãã¬ã³ãŒããæããŠããŸãã éåžžã«èå³æ·±ãäœæ¥ããžãã¯ããããç空ãçºçãããšããããã®é£éãçºçããŸãã hot
åæ§ç¯ãããšãã€ã³ããã¯ã¹ãæŽæ°ããã«ãã¹ãŠãåäœãç¶ãããã¹ãŠããªãœãŒã¹ã®ç¡é§ãæžãããŠè¡ãããŸãã
ãããŠãããªããæã£ãŠãããšã n_tup_hot_upd
倧ããããšãŠãè¯ãã§ãã ããã¯ã軜éã¢ããããŒããæ®åããŠããããªãœãŒã¹ã®ç¹ã§ç§ãã¡ã«ãšã£ãŠã¯å®ããªãããã¹ãŠãããŸãããããšãæå³ããŸãã
ALTER TABLE table_name SET (fillfactor = 70);
é³éãäžããæ¹æ³ hot update
ããïŒ äœ¿çšã§ããŸã fillfactor
ã ããã¯ãINSERT ã䜿çšããŠããŒãã«å
ã®ããŒãžãåãããšãã«äºçŽããã空ãé åã®ãµã€ãºã決å®ããŸãã æ¿å
¥ãè¡šã«æ¿å
¥ããããšãããŒãžãå®å
šã«åããããããŒãžå
ã«ç©ºã®ã¹ããŒã¹ãæ®ããŸããã 次ã«ãæ°ããããŒãžã匷調衚瀺ãããŸãã ããŒã¿ãå床å
¥åãããŸãã ãããããã©ã«ãã®åäœã§ãfillfactor = 100% ã§ãã
fillfactor ã 70% ã«èšå®ã§ããŸãã ã€ãŸããæ¿å ¥ã§ã¯æ°ããããŒãžãå²ãåœãŠãããŸããããããŒãžã® 70% ããåãŸã£ãŠããŸããã§ããã ãããŠãæ®ã30ïŒ ãäºåãšããŠæ®ã£ãŠããŸãã æŽæ°ãè¡ãå¿ èŠãããå Žåãã»ãšãã©ã®å ŽåãåãããŒãžã§æŽæ°ãè¡ãããè¡ã®æ°ããããŒãžã§ã³ãåãããŒãžã«åãŸããŸãã ãããŠhot_updateãè¡ãããŸãã ããã«ãããè¡šã«æžãããããªããŸãã
select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));
èªåããã¥ãŒã ãã¥ãŒã Autovacuum ã¯ãPostgreSQL ã«çµ±èšãã»ãšãã©ãªããµãã·ã¹ãã ã§ãã çŸæç¹ã§ã®ããã¥ãŒã ã®æ°ã¯ãpg_stat_activity ã®ããŒãã«ã§ã®ã¿ç¢ºèªã§ããŸãã ãã ããå€åºå ã§ãã¥ãŒã«ã©ãã ãã®ããŒãã«ãããããææ¡ããããšã¯éåžžã«å°é£ã§ãã
泚æïŒ _Postgres 10 以éãç空ã®è¿œè·¡ç¶æ³ã¯å€§å¹ ã«æ¹åãããŸãã - pg_stat_progress ãã¥ãŒã衚瀺ãããŸããããã«ãããèªåããã¥ãŒã ç£èŠã®åé¡ãå€§å¹ ã«ç°¡çŽ åãããŸãã
ãã®ç°¡ç¥åãããã¯ãšãªã䜿çšã§ããŸãã ãããŠãç空åŒãããã€è¡ãã¹ãããåãããŸãã ããããæé€æ©ã¯ãã€ãã©ã®ããã«éå§ããã°ããã®ã§ãããã? ãããã¯ãåã«èª¬æããæååã®å€ãããŒãžã§ã³ã§ãã æŽæ°ãçºçããè¡ã®æ°ããããŒãžã§ã³ãæ¿å
¥ãããŸããã æååã®å€ãããŒãžã§ã³ãç»å ŽããŸããã ããŒãã« pg_stat_user_tables
ãããªãã©ã¡ãŒã¿ããã n_dead_tup
ã ãç¡å¹ãªãè¡ã®æ°ã瀺ããŸãã ãããŠãç¡å¹ãªè¡ã®æ°ãç¹å®ã®ãããå€ãè¶
ãããšããã«ãèªåããã¥ãŒã ãå®è¡ãããŸãã
ãããŠããã®éŸå€ã¯ã©ã®ããã«èšç®ãããã®ã§ãããã? ããã¯ãããŒãã«å
ã®ç·è¡æ°ã«å¯Ÿããéåžžã«å
·äœçãªå²åã§ãã ãã©ã¡ãŒã¿ããããŸã autovacuum_vacuum_scale_factor
ã ããã«ãã£ãŠå²åã決ãŸããŸãã 10% + è¿œå ã®åºæ¬ãããå€ãšã㊠50 è¡ããããšããŸãã ãããŠäœãèµ·ããã§ããããïŒ ããŒãã«å
ã®å
šè¡ã®ã10% + 50ããããå€ãã®ç¡å¹ãªè¡ãããå ŽåãããŒãã«ãèªåããã¥ãŒã ã«èšå®ããŸãã
select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));
ãã ãããã€ã³ãã XNUMX ã€ãããŸãã ãã©ã¡ãŒã¿ã®åºæ¬ãããå€ av_base_thresh
О av_scale_factor
åå¥ã«å²ãåœãŠãããå ŽåããããŸãã ãããã£ãŠããããå€ã¯ã°ããŒãã«ã§ã¯ãªããããŒãã«ããšã«åå¥ã«ãªããŸãã ãããã£ãŠãèšç®ããã«ã¯ãããªãã¯ãããªãã¯ã䜿çšããå¿
èŠããããŸãã ãèå³ãããããŸããããAvito ã®ååã®äœéšè«ãã芧ãã ãã (ã¹ã©ã€ãäžã®ãªã³ã¯ã¯ç¡å¹ã§ãããæ¬æå
ã§æŽæ°ãããŠããŸã)ã
圌ãã¯ããæžãã
ããã«ã€ããŠäœãã§ããã§ãããã? é·ããã¥ãŒããããèªåããã¥ãŒã ã察å¿ã§ããªãå Žåã¯ãããã¥ãŒã äœæ¥å¡ã®æ°ãå¢ããããåã«ããã¥ãŒã ãããç©æ¥µçã«ããããšãã§ããŸããããæ©ãããªã¬ãŒãããããã«ãããŒãã«ã现ããåŠçããŸãã ããããã°è¡åãæžããŸãã - ããã§ã®äž»ãªç®çã¯ããã£ã¹ã¯ã®è² è·ãç£èŠããããšã§ãã SSD / NVMe ããã€ã¹ã®åºçŸã«ããããã®åé¡ã¯ããŸãç®ç«ããªããªããŸããããç空ã®åé¡ã¯ç¡æã§ã¯ãããŸããã
pg_stat_all_indexes ã¯ã€ã³ããã¯ã¹ã«é¢ããçµ±èšã§ãã 圌女ã¯å€§ãããããŸããã ãããŠãããããã€ã³ããã¯ã¹ã®äœ¿çšã«é¢ããæ å ±ãååŸã§ããŸãã ããšãã°ãã©ã®ã€ã³ããã¯ã¹ãäœã£ãŠããã®ããå€æã§ããŸãã
ãã§ã«èšã£ãããã«ã update ã¯ããŒãã«ãæŽæ°ããã ãã§ãªããã€ã³ããã¯ã¹ãæŽæ°ããŸãã ãããã£ãŠãããŒãã«ã«å€æ°ã®ã€ã³ããã¯ã¹ãããå ŽåãããŒãã«å
ã®è¡ãæŽæ°ãããšãã«ãã€ã³ããã¯ã¹ä»ããã£ãŒã«ãã®ã€ã³ããã¯ã¹ãæŽæ°ããå¿
èŠããããŸãã ã€ã³ããã¯ã¹ ã¹ãã£ã³ãè¡ãããŠããªãæªäœ¿çšã®ã€ã³ããã¯ã¹ãããå Žåããããã¯ãã©ã¹ããšããŠãã³ã°ããŸãã ãããŠãããããåãé€ãå¿
èŠããããŸãã ãã®ããã«ã¯ãã£ãŒã«ããå¿
èŠã§ã idx_scan
ã ã€ã³ããã¯ã¹ ã¹ãã£ã³ã®æ°ã ããèŠãŠã¿ãŸãããã æ¯èŒçé·æéã®çµ±èšä¿åæé (å°ãªããšã 2 ïœ 3 é±é) ã«ããã£ãŠã€ã³ããã¯ã¹ã®ã¹ãã£ã³ããŒãã®å Žåã¯ãäžè¯ã€ã³ããã¯ã¹ã§ããå¯èœæ§ãé«ããããåé€ããå¿
èŠããããŸãã
泚æïŒ ã¹ããªãŒãã³ã° ã¬ããªã±ãŒã·ã§ã³ ã¯ã©ã¹ã¿ãŒã®å Žåã«æªäœ¿çšã®ã€ã³ããã¯ã¹ãæ€çŽ¢ãããšãã¯ãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã確èªããå¿ èŠããããŸãã çµ±èšã¯ã°ããŒãã«ã§ã¯ãªããããã€ã³ããã¯ã¹ããã¹ã¿ãŒã§äœ¿çšãããŠããªãå Žåã¯ã(è² è·ãããå Žå) ã¬ããªã«ã§äœ¿çšã§ããŸãã
XNUMX ã€ã®ãªã³ã¯:
ãããã¯ãæªäœ¿çšã®ã€ã³ããã¯ã¹ãæ€çŽ¢ããæ¹æ³ã«ã€ããŠã®ããé«åºŠãªã¯ãšãªã®äŸã§ãã
XNUMX çªç®ã®ãªã³ã¯ã¯ããªãèå³æ·±ãã¯ãšãªã§ãã ããã«ã¯éåžžã«èªæã§ã¯ãªãããžãã¯ãå«ãŸããŠããŸãã 埩ç¿çšã«ãªã¹ã¹ã¡ããŸãã
ã€ã³ããã¯ã¹ã«ãã£ãŠä»ã«äœãåèšããå¿ èŠããããŸãã?
-
æªäœ¿çšã®ã€ã³ããã¯ã¹ã¯äžè¯ã§ãã
-
ã¹ããŒã¹ãåããŸãã
-
æŽæ°æäœãé ãããŸãã
-
æé€æ©ã®è¿œå äœæ¥ã
䜿çšãããŠããªãã€ã³ããã¯ã¹ãåé€ããã°ãããŒã¿ããŒã¹ãæ¹åãããã ãã§ãã
次ã®æ¯è²ã¯ã pg_stat_activity
ã ããã¯ãŠãŒãã£ãªãã£ã®é¡äŒŒç©ã§ã ps
ãPostgreSQL ã®ã¿ã ããã ps
ãããããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ããã»ã¹ãç£èŠãããšã pg_stat_activity
PostgreSQL å
ã®ã¢ã¯ãã£ããã£ã衚瀺ãããŸãã
ããããäœãåŸãããã§ããããïŒ
select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;
ããŒã¿ããŒã¹å ã§èµ·ãã£ãŠããå šäœçãªã¢ã¯ãã£ããã£ã確èªã§ããŸãã æ°ããå±éãè¡ãããšãã§ããŸãã ããã§ã¯ãã¹ãŠãççºããæ°ããæ¥ç¶ã¯åãå ¥ãããããã¢ããªã±ãŒã·ã§ã³ã«ãšã©ãŒãæŒãå¯ããŸãã
select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;
ãã®ãããªã¯ãšãªãå®è¡ãããšãæ倧æ¥ç¶å¶éã«å¯Ÿããæ¥ç¶ã®åèšããŒã»ã³ããŒãžã衚瀺ãããæãå€ãã®æ¥ç¶ãæã£ãŠãã人ãããããŸãã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒã cron_role
508 åã®æ¥ç¶ãéããŸããã ãããŠã圌ã«äœããèµ·ãããŸããã ããã«å¯ŸåŠããŠç¢ºèªããå¿
èŠããããŸãã ãããŠãããã¯ããçš®ã®ç°åžžãªæ¥ç¶æ°ã§ããå¯èœæ§ãååã«ãããŸãã
OLTP ããŒããããå Žåãã¯ãšãªã¯é«éãã€éåžžã«é«éã§ããå¿ èŠããããé·ãã¯ãšãªããã£ãŠã¯ãªããŸããã ãã ããé·æã«ããããªã¯ãšã¹ãã®å Žåã¯ãçæçã«ã¯å¿é ããå¿ èŠã¯ãããŸãããã é·æçã«ã¯ãé·ãã¯ãšãªã¯ããŒã¿ããŒã¹ã«æªåœ±é¿ãåãŒããããŒãã«ã®æçåãçºçãããšãã«ããŒãã«ã®è¥å€§åã®åœ±é¿ãå¢å€§ãããŸãã è¥å€§åããã¯ãšãªãšé·ãã¯ãšãªã¯äž¡æ¹ãšãç Žæ£ããå¿ èŠããããŸãã
select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;
泚: ãã®ãããªãªã¯ãšã¹ãã§ã¯ãé·ããªã¯ãšã¹ããšãã©ã³ã¶ã¯ã·ã§ã³ãå®çŸ©ã§ããŸãã é¢æ°ã䜿çšããŸã clock_timestamp()
åŽåæéã決ããããã é·ããªã¯ãšã¹ããèŠã€ããã®ã§ãèŠããŠå®è¡ã§ããŸã explain
ãèšç»ãèŠãŠãäœãšãæé©åããŸãã çŸåšã®é·ããªã¯ãšã¹ããæ®åœ±ããŠçããŠããŸãã
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
äžæ£ãªãã©ã³ã¶ã¯ã·ã§ã³ã¯ããã©ã³ã¶ã¯ã·ã§ã³å ã§ã¢ã€ãã«ç¶æ ãããã³ãã©ã³ã¶ã¯ã·ã§ã³å ã§ã¢ã€ãã«ç¶æ (äžæ¢ããã) ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ãã
ã©ãããæå³ã§ããïŒ ãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯è€æ°ã®ç¶æ
ããããŸãã ãããŠããããã®ç¶æ
ã®ããããããã€ã§ãçºçããå¯èœæ§ããããŸãã ç¶æ
ãå®çŸ©ãããã£ãŒã«ãããããŸã state
ãã®èŠæ¹ã§ã¯ã ãããŠãããç¶æ
ã決å®ããããã«äœ¿çšããŸãã
select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';
ãããŠãäžã§è¿°ã¹ãããã«ãããã XNUMX ã€ã®å·ã¯ ãã©ã³ã¶ã¯ã·ã§ã³äžã®ã¢ã€ãã«ãšãã©ã³ã¶ã¯ã·ã§ã³äžã®ã¢ã€ãã« (äžæ¢) ã¯äžè¯ã§ãã ããã¯äœã§ããïŒ ããã¯ãã¢ããªã±ãŒã·ã§ã³ããã©ã³ã¶ã¯ã·ã§ã³ãéå§ããããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããæ¥åãéå§ãããšãã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãªãŒãã³ã®ãŸãŸã§ãã Postrges ãã©ã³ã¶ã¯ã·ã§ã³ ãšã³ãžã³ã®ã¢ãŒããã¯ãã£ã«ããããã³ã°ããäœãèµ·ããããæ¥ç¶ãåãããå€æŽãããè¡ãããã¯ãããä»ã®ããŒãã«ãããã«è¥å€§åããå¯èœæ§ããããŸãã ãããŠããããã«ããŠãäžè¬ã«æ害ã§ããããããã®ãããªååŒãæé€ãããã¹ãã§ãã
ããŒã¿ããŒã¹å ã« 5 ïœ 10 ïœ 20 ãè¶ ããããããååšããå Žåã¯ãå¿é ããŠãããã䜿ã£ãŠäœããå§ããå¿ èŠããããŸãã
ããã§ãèšç®æéã«äœ¿çšããŸã clock_timestamp()
ã ç§ãã¡ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãèšé²ããã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã
äžã§è¿°ã¹ãããã«ãããã¯ãšã¯ãXNUMX ã€ä»¥äžã®ãã©ã³ã¶ã¯ã·ã§ã³ã XNUMX ã€ãŸãã¯ã°ã«ãŒãã®ãªãœãŒã¹ãããã£ãŠç«¶åããããšã§ãã ãã®ããã«ãã£ãŒã«ãããããŸã waiting
ããŒã«å€ä»ã true
ãŸã㯠false
.
True - ããã¯ããã»ã¹ãåŸ æ©äžã§ãããäœããè¡ãå¿ èŠãããããšãæå³ããŸãã ããã»ã¹ãåŸ æ©ããŠãããšãã¯ããã®ããã»ã¹ãéå§ããã¯ã©ã€ã¢ã³ããåŸ æ©ããŠããŸãã ãã©ãŠã¶å ã®ã¯ã©ã€ã¢ã³ãã座ã£ãŠåŸ æ©ããŸãã
èŠåïŒ _Postgres 9.6 以éããã£ãŒã«ã waiting
åé€ãããããã« XNUMX ã€ã®æ
å ±ãã£ãŒã«ãã«çœ®ãæããããŸãã wait_event_type
О wait_event
._
äœãããŸããïŒ é·ãéçå®ã§ãããšããã£ãŠããå Žåã¯ããã®ãããªèŠæ±ãåãé€ãå¿ èŠããããŸãã ç§ãã¡ã¯ãã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ãæ®åœ±ããã ãã§ãã ç§ãã¡ã¯ããªãœãŒã¹ã®ç«¶åãèµ·ãããªãããã«ãäœããã®æ¹æ³ã§æé©åããå¿ èŠããããã®ãéçºè ã«æžããŸãã ãããŠéçºè ã¯ããã®ãããªããšãèµ·ãããªãããã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã
ãããŠã極端ã ãåæã«èŽåœçã§ã¯ãªãå¯èœæ§ã®ããã±ãŒã¹ã¯ã ãããããã¯ã®çºçã XNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã XNUMX ã€ã®ãªãœãŒã¹ãæŽæ°ãããã®åŸããã§ã«å察åŽã®ãªãœãŒã¹ã«å床ã¢ã¯ã»ã¹ããŸãã ãã®å ŽåãPostgreSQL ã¯ãã©ã³ã¶ã¯ã·ã§ã³èªäœãååŸããŠçµäºããä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŒãç¶ãåäœã§ããããã«ããŸãã ããã¯è¡ãæ¢ãŸãã®ç¶æ³ã§ããã圌女ã¯èªåèªèº«ãç解ããŠããŸããã ãããã£ãŠãPostgreSQL ã¯æ¥µç«¯ãªæªçœ®ãè¬ããããšãäœåãªããããŠããŸãã
次ã«ãããã¯ã远跡ã§ãã XNUMX ã€ã®ã¯ãšãªã瀺ããŸãã ãã¥ãŒã䜿çšããŸã pg_locks
ãéãããã¯ã远跡ã§ããããã«ãªããŸãã
æåã®ãªã³ã¯ã¯ãªã¯ãšã¹ã ããã¹ããã®ãã®ã§ãã ããªãé·ãã§ããã
XNUMX çªç®ã®ãªã³ã¯ã¯ããã¯ã«é¢ããèšäºã§ãã èªããšåœ¹ã«ç«ã¡ãŸããããšãŠãé¢çœãã§ãã
ããã§ãäœãèŠããã§ããããïŒ XNUMX ã€ã®ãªã¯ãšã¹ãã衚瀺ãããŸãã ãšã®ååŒ ALTER TABLE
ããããã³ã°ãã©ã³ã¶ã¯ã·ã§ã³ã§ãã éå§ãããŸãããçµäºããããã®ãã©ã³ã¶ã¯ã·ã§ã³ãæçš¿ããã¢ããªã±ãŒã·ã§ã³ã¯ã©ããã§ä»ã®ããšãè¡ã£ãŠããŸãã ãã㊠XNUMX çªç®ã®ãªã¯ãšã¹ãã¯æŽæ°ã§ãã å€æŽããŒãã«ãå®äºããã®ãåŸ
ã£ãŠããäœæ¥ãç¶è¡ããŸãã
ããã«ããã誰ã誰ãéã蟌ããã®ãã誰ã誰ãææããŠããã®ããç¥ãããšãã§ããããã«å¯ŸåŠããããšãã§ããŸãã
次ã®ã¢ãžã¥ãŒã«ã¯ pg_stat_statements
ã å
ã»ã©ãèšããŸããããããã¯ã¢ãžã¥ãŒã«ã§ãã ããã䜿çšããã«ã¯ããã®ã©ã€ãã©ãªãæ§æã«ããŒãããPostgreSQL ãåèµ·åãã(XNUMX ã€ã®ã³ãã³ãã§) ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸããããããã°ãæ°ãããã¥ãŒã衚瀺ãããŸãã
CÑеЎМее вÑÐµÐŒÑ Ð·Ð°Ð¿ÑПÑа в ЌОлОÑекÑМЎаÑ
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;
СаЌÑе акÑОвМП пОÑÑÑОе (в shared_buffers) запÑПÑÑ
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;
ããããäœãåŸãããã§ããããïŒ ç°¡åãªããšã«ã€ããŠèšãã°ãã¯ãšãªã®å¹³åå®è¡æéãååŸã§ããŸãã æéã䌞ã³ãŠãããšããããšã¯ãPostgreSQL ã®å¿çãé ããªã£ãŠãããããäœããè¡ãå¿ èŠãããããšãæå³ããŸãã
å ±æãããã¡ãŒå ã®ããŒã¿ãå€æŽãããããŒã¿ããŒã¹å ã§æãã¢ã¯ãã£ããªæžã蟌ã¿ãã©ã³ã¶ã¯ã·ã§ã³ã確èªã§ããŸãã ããã§èª°ãããŒã¿ãæŽæ°ãŸãã¯åé€ãããã確èªããŸãã
ãããŠããããã®ã¯ãšãªã®ããŸããŸãªçµ±èšã確èªããã ãã§ãã
æã
pg_stat_statements
ã¬ããŒãã®äœæã«äœ¿çšãããŸãã çµ±èšã¯ XNUMX æ¥ã« XNUMX åãªã»ãããããŸãã ç©ã¿äžããŠãããŸãããã 次åçµ±èšããªã»ããããåã«ãã¬ããŒããäœæããŸãã ããã«ã¬ããŒããžã®ãªã³ã¯ããããŸãã èŠãããšãã§ããŸãã
ç§ãã¡ã¯äœãããŠããã®ã§ããããïŒ ãã¹ãŠã®ãªã¯ãšã¹ãã®å šäœçãªçµ±èšãèšç®ããŸãã 次ã«ãã¯ãšãªããšã«ããã®å šäœçãªçµ±èšã«å¯Ÿããåã ã®å¯äžãã«ãŠã³ãããŸãã
ãããŠäœãèŠããã§ããããïŒ ä»ã®ãã¹ãŠã®ãªã¯ãšã¹ãã®èæ¯ã«å¯ŸããŠãç¹å®ã®ã¿ã€ãã®ãã¹ãŠã®ãªã¯ãšã¹ãã®åèšå®è¡æéã確èªã§ããŸãã å šäœåãšé¢é£ã㊠CPU ãš I/O ã®äœ¿çšç¶æ³ã確èªã§ããŸãã ãããŠããããã®ãªã¯ãšã¹ãã¯ãã§ã«æé©åãããŠããŸãã ç§ãã¡ã¯ãã®ã¬ããŒãã«åºã¥ããŠäžäœã®ã¯ãšãªãæ§ç¯ããŠãããäœãæé©åããããæ€èšããææããã§ã«åŸãŠããŸãã
èå°è£ã§ã¯äœãããã®ã§ãããã? æéãéãããŠãããããæ€èšã§ããªãã£ãææ¡ããŸã ããã€ããããŸãã
ãã pgstattuple
ããã¯ãæšæºã® contribs ããã±ãŒãžã®è¿œå ã¢ãžã¥ãŒã«ã§ããããŸãã è©äŸ¡ã§ããããã«ãªããŸã bloat
ããããããŒãã«ã ããŒãã«ã®æçåã æçåã倧ããå Žåã¯ãæçåãåé€ããå¥ã®ããŒã«ã䜿çšããå¿
èŠããããŸãã ãããŠæ©èœ pgstattuple
é·ãåããŸãã ããŒãã«ãå€ããã°å€ãã»ã©ãåäœæéã¯é·ããªããŸãã
次ã®æ皿㯠pg_buffercache
ã ããã«ãããå
±æãããã¡ãæ€æ»ã§ããã©ã®ããŒãã«ã®ãããã¡ ããŒãžãã©ã®çšåºŠéäžçã«äœ¿çšãããŠãããã確èªã§ããŸãã ãŸããå
±æãããã¡ã調ã¹ãŠãããã§äœãèµ·ãã£ãŠããããè©äŸ¡ã§ããããã«ãªããŸãã
次ã®ã¢ãžã¥ãŒã«ã¯ pgfincore
ã ã·ã¹ãã ã³ãŒã«ãéããŠäœã¬ãã«ã®ããŒãã«æäœãå®è¡ã§ããŸãã mincore()
ã€ãŸããããŒãã«ãå
±æãããã¡ã«ããŒãããããã¢ã³ããŒããããã§ããŸãã ãŸããç¹ã«ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ããŒãž ãã£ãã·ã¥ãã€ãŸãããŒãž ãã£ãã·ã¥ãå
±æãããã¡ãŒå
ã§ããŒãã«ãã©ãã ãå æãããŠããããæ€æ»ããããšãã§ããåçŽã«ããŒãã«ã®è² è·ãè©äŸ¡ããããšãã§ããŸãã
次ã®ã¢ãžã¥ãŒã«ã¯ pg_stat_kcache
ã ã·ã¹ãã ã³ãŒã«ã䜿çšããŸã getrusage()
ã ãããŠããªã¯ãšã¹ããå®è¡ãããååŸã«ãããå®è¡ããŸãã ãããŠãååŸãããçµ±èšã«ããããªã¯ãšã¹ãããã£ã¹ã¯ I/Oãã€ãŸããã¡ã€ã« ã·ã¹ãã ã®æäœã«ã©ãã ãè²»ãããããæšå®ããããã»ããµã®äœ¿çšç¶æ³ã確èªããããšãã§ããŸãã ãã ãããã®ã¢ãžã¥ãŒã«ã¯ãŸã æ°ãã (khe-khe)ããã®åäœã«ã¯ PostgreSQL 9.4 ãšãåã«è¿°ã¹ã pg_stat_statements ãå¿
èŠã§ãã
-
çµ±èšã䜿çšã§ããæ©èœã¯äŸ¿å©ã§ãã ãµãŒãããŒãã£ã®ãœãããŠã§ã¢ã¯å¿ èŠãããŸããã èŠããèŠããäœãããããå®è¡ããããšãã§ããŸãã
-
çµ±èšã®äœ¿çšã¯ç°¡åã§ãåçŽãª SQL ã§ãã ãªã¯ãšã¹ããåéããç·šéããéä¿¡ãã確èªããŸããã
-
çµ±èšã¯çåã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã 質åãããå Žåã¯ãçµ±èšã«ç®ãåããŸããçµæãèŠãŠãçµè«ãå°ãåºããåæããŸãã
-
ãããŠå®éšããŠã¿ãŸãããã ããããã®ãªã¯ãšã¹ããããããã®ããŒã¿ã æ¢åã®ã¯ãšãªã¯ãã€ã§ãæé©åã§ããŸãã ãªãªãžãã«ãããèªåã«åã£ãç¬èªã®ããŒãžã§ã³ã®ãªã¯ãšã¹ããäœæããŠäœ¿çšã§ããŸãã
ãªãã¡ã¬ã³ã¹
èšäºå ã§èŠã€ãã£ãæå¹ãªãªã³ã¯ã¯ãããã«åºã¥ããŠã¬ããŒãã«å«ãŸããŠããŸããã
èè
ã¯ãã£ãšæžã
çµ±èšã³ã¬ã¯ã¿ãŒ
ã·ã¹ãã 管çæ©èœ
æçš¿ã¢ãžã¥ãŒã«
SQL ãŠãŒãã£ãªãã£ãš SQL ã³ãŒãã®äŸ
ãæž èŽããããšãããããŸããïŒ
åºæïŒ habr.com