PeterZaitsevã«ããMySQLPerformance Bottlenecksã«é¢ããèšäºãåºã«ãPostgreSQLã«ã€ããŠå°ãã話ãããããšæããŸãã
ORMãã¬ãŒã ã¯ãŒã¯ã¯ãæè¿PostgreSQLã§åäœããããã«ãã䜿çšãããŸããéåžžã¯æ£åžžã«æ©èœããŸãããæéã®çµéãšãšãã«è² è·ãå¢å ããããŒã¿ããŒã¹ãµãŒããŒã調æŽããå¿ èŠããããŸããPostgreSQLãšåããããä¿¡é Œæ§ããããŸããããã©ãã£ãã¯ãå¢ãããšé床ãäœäžããå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã®ããã«ããã¯ã解æ¶ããæ¹æ³ã¯ãããããããŸããããã®èšäºã§ã¯ä»¥äžã«çŠç¹ãåœãŠãŸãã
- ãµãŒããŒãã©ã¡ãŒã¿
- æ¥ç¶ç®¡ç
- èªåç空èšå®
- è¿œå ã®èªåç空èšå®
- ãããŒãã£ã³ã°ããŒãã«ïŒèšåŒµïŒ
- ããŒã¿ã®ãããã¹ããã
- ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒ
- ã¬ããªã±ãŒã·ã§ã³
- ãµãŒããŒç°å¢
ãã«ããŽãªããšãæœåšçãªåœ±é¿ãã«ã€ããŠ
ãè€éãããšã¯ãææ¡ããããœãªã¥ãŒã·ã§ã³ã®å®è£ ãããã«ç°¡åããæããŸãããŸãããæœåšçãªåœ±é¿ãã¯ãã·ã¹ãã ããã©ãŒãã³ã¹ã®æ¹åã®çšåºŠã瀺ããŸãããã ããã·ã¹ãã ã®å€ããçš®é¡ãæè¡çè² åµãªã©ã«ãããŸããè€éããšåœ±é¿ãæ£ç¢ºã«èª¬æããããšã¯åé¡ã«ãªãå¯èœæ§ããããŸããçµå±ã®ãšãããå°é£ãªç¶æ³ã§ã¯ãæçµçãªéžæã¯åžžã«ããªã次第ã§ãã
ã«ããŽãªïŒ
- è€é
- äœ
- å¹³å
- é«ã
- äœäžé«
- æœåšçãªåœ±é¿
- äœ
- å¹³å
- é«ã
- äœäžé«
ãµãŒããŒãã©ã¡ãŒã¿
é£æ床ïŒäœãã
æœåšçãªåœ±é¿ïŒé«ãã
å°ãåãŸã§ã¯ãçŸåšã®ããŒãžã§ã³ã®postgresãi386ã§å®è¡ã§ããããšããããŸããããã®åŸãããã©ã«ãèšå®ãå€æŽãããŸãããã䜿çšãããªãœãŒã¹ãæå°ã«ãªãããã«æ§æãããŠããŸãã
ãããã®èšå®ã¯éåžžã«ç°¡åã«å€æŽã§ããéåžžã¯åæã€ã³ã¹ããŒã«æã«æ§æãããŸãããããã®ãã©ã¡ãŒã¿ã®å€ãæ£ãããªããšãCPUãšI / Oã®äœ¿çšçãé«ããªãå¯èœæ§ããããŸãïŒ
- ãã©ã¡ãŒã¿effective_cache_sizeã50ã75ïŒ
- ãã©ã¡ãŒã¿shared_buffersã1 / 4-1 / 3RAMã®é
- ãã©ã¡ãŒã¿work_memã 10ã¡ã¬ãã€ã
Effective_cache_sizeã®æšå¥šå€ã¯ãäžè¬çã§ããããtopãïŒfree + cachedïŒãåç §ãããšãããæ£ç¢ºã«èšç®ã§ããŸããshared_buffers
ã®å€ãèšç®ããããšã¯ãèå³æ·±ãããºã«ã§ããããã¯2ã€ã®è§åºŠããèŠãããšãã§ããŸããããŒã¿ããŒã¹ãå°ããå Žåã¯ãããŒã¿ããŒã¹å šäœãRAMã«åããã®ã«ååãªå€§ããã®shared_buffersã®å€ãèšå®ã§ããŸããäžæ¹ãé »ç¹ã«äœ¿çšããããŒãã«ãšã€ã³ããã¯ã¹ã®ã¿ãã¡ã¢ãªã«ããŒãããããã«æ§æã§ããŸãïŒ80/20ãæãåºããŠãã ããïŒãïŒã以åã¯ãå€ãRAMã®éã®1/3ã«èšå®ããããšãæšå¥šãããŠããŸããããæéã®çµéãšãšãã«ãã¡ã¢ãªã®éãå¢ããã«ã€ããŠãå€ã¯1/4ã«æžå°ããŸãããå²ãåœãŠãããã¡ã¢ãªãå°ãªãå ŽåãI / Oãšããã»ããµã®è² è·ãå¢å ããŸããããã»ããµãšI / Oè² è·ã®ãã©ããŒã«éãããšãã¡ã¢ãªå²ãåœãŠãå€ãããããšã瀺ãããŸãã
èæ ®ãã¹ããã1ã€ã®èŠçŽ ã¯ãOSãã£ãã·ã¥ã§ããååãªRAMãäžãããããšãLinuxã¯ããŒãã«ãšã€ã³ããã¯ã¹ãã¡ã¢ãªã«ãã£ãã·ã¥ããæ§ææ¹æ³ã«ãã£ãŠã¯ãPostgreSQLãRAMã§ã¯ãªããã£ã¹ã¯ããããŒã¿ãèªã¿åã£ãŠãããšä¿¡ã蟌ãŸããå¯èœæ§ããããŸããåãããŒãžãpostgresãããã¡ãšOSãã£ãã·ã¥ã®äž¡æ¹ã«ããããããshared_buffersãããŸã倧ããããªãçç±ã®1ã€ã§ããpg_buffercacheæ¡åŒµæ©èœã®äœ¿çšãã£ãã·ã¥ã®äœ¿çšç¶æ³ããªã¢ã«ã¿ã€ã ã§ç¢ºèªã§ããŸããwork_mem
ãã©ã¡ãŒã¿ãŒã¯ããœãŒãæäœã«äœ¿çšãããã¡ã¢ãªãŒã®éãæå®ããŸãããã®å€ã®èšå®ãäœããããšããã£ã¹ã¯äžã®äžæãã¡ã€ã«ã䜿çšããŠãœãŒããå®è¡ããããããããã©ãŒãã³ã¹ãäœäžããããšãä¿èšŒãããŸããäžæ¹ã倧ããªå€ãèšå®ããŠãããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããããæ¥ç¶æ°ãå€ããšRAMãäžè¶³ãããªã¹ã¯ããããŸãããã¹ãŠã®ãªã¯ãšã¹ããšã»ãã·ã§ã³ã§äœ¿çšãããã¡ã¢ãªãåæããããšã§ãå¿ èŠãªå€ãèšç®ã§ããŸãã EXPLAIN ANALYZEã䜿çšãããšããœãŒãæäœãã©ã®ããã«å®è¡ããããã確èªããã»ãã·ã§ã³ã®å€ãå€æŽããããšã§ããã£ã¹ã¯ãžã®ãã©ãã·ã¥ããã€éå§ãããããå€å¥ã§ããŸãããã³ãããŒã¯ã 䜿çšããããšãã§ããŸã
ã·ã¹ãã ã
æ¥ç¶ç®¡ç
é£æ床ïŒäœãã
æœåšçãªåœ±é¿ïŒäœ-äž-é«é«
è² è·ã¯éåžžãåäœæéãããã®ã¯ã©ã€ã¢ã³ãã»ãã·ã§ã³ã®å¢å ã«é¢é£ããŠããŸãããããã®æ°ãå€ããããšãããã»ã¹ããããã¯ãããããé 延ãçºçãããããšã©ãŒãçºçãããããå¯èœæ§ããããŸãã
ç°¡åãªè§£æ±ºçã¯ãåææ¥ç¶ã®æ倧æ°ãå¢ããããšã§ãã
# postgresql.conf: default is set to 100<br />max_connections
ãã ããããå¹ççãªã¢ãããŒãã¯æ¥ç¶ããŒãªã³ã°ã§ããå€ãã®è§£æ±ºçããããŸãããæã人æ°ã®ããã®ã¯pgbouncerã§ããPgBouncerã¯ã次ã®3ã€ã®ã¢ãŒãã®ããããã䜿çšããŠæ¥ç¶ã管çã§ããŸãã
- (session pooling). . , . , . .
- (transaction pooling). . PgBouncer , , .
- (statement pooling). . . , .
Secure Socket LayerïŒSSLïŒã«ã泚æãæãå¿ èŠããããŸããæå¹ã«ãããšãæ¥ç¶ã¯ããã©ã«ãã§SSLã䜿çšããŸããããã«ãããæå·åãããŠããªãæ¥ç¶ãšæ¯èŒããŠããã»ããµã®è² è·ãå¢å ããŸããéåžžã®ã¯ã©ã€ã¢ã³ãã®å ŽåãSSLïŒ
pg_hba.conf
ïŒã䜿çšããã«ãã¹ãããŒã¹ã®èªèšŒãæ§æãã管çã¿ã¹ã¯ãŸãã¯ã¹ããªãŒãã³ã°ã¬ããªã±ãŒã·ã§ã³ã«SSLã䜿çšã§ããŸãã
èªåç空èšå®
é£æ床ïŒäžã
æœåšçãªåœ±é¿ïŒäœ-äžã
ãã«ãããŒãžã§ã³åæå®è¡å¶åŸ¡ã¯ãPostgreSQLããã®ãããªäººæ°ã®ããããŒã¿ããŒã¹ãœãªã¥ãŒã·ã§ã³ã«ããåºæ¬ååã®1ã€ã§ãããã ããåä»ãªåé¡ã®1ã€ã¯ãå€æŽãŸãã¯åé€ãããã¬ã³ãŒãããšã«ãæªäœ¿çšã®ã³ããŒãäœæãããæçµçã«ã¯ç Žæ£ããå¿ èŠãããããšã§ããèªåç空ããã»ã¹ãæ£ããæ§æãããŠããªããšãããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸããããã«ããµãŒããŒã®è² è·ãé«ãã»ã©ãåé¡ãæããã«ãªããŸãã
èªåããã¥ãŒã ããŒã¢ã³ãå¶åŸ¡ããã«ã¯ã次ã®ãã©ã¡ãŒã¿ã䜿çšããŸãã
- autovacuum_max_workers. ( ). , . . . .
- maintenance_work_mem. , . , . , .
- autovacuum_freeze_max_age TXID WRAPAROUND. , , . , , , . , txid, . / txid pg_stat_activity WRAPAROUND.
RAMãšCPUã®éè² è·ã«æ³šæããŠãã ãããæåã«èšå®ãããå€ãé«ãã»ã©ãã·ã¹ãã ã®è² è·ãå¢å ãããšãã«ãªãœãŒã¹ãæ¯æžãããªã¹ã¯ãé«ããªããŸããèšå®ãé«ããããšãç¹å®ã®è² è·ã¬ãã«ãè¶ ãããšããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããå¯èœæ§ããããŸããwork_memã®
èšç®ãšåæ§ã«ããã®å€ã¯ç®è¡çã«èšç®ãããããã³ãããŒã¯ããŠæé©ãªå€ãååŸã§ããŸãã
è¿œå ã®èªåç空èšå®
é£æ床ïŒé«ãã
æœåšçãªåœ±é¿ïŒé«ãã
ãã®æ¹æ³ã¯è€éã§ãããããã·ã¹ãã ããã©ãŒãã³ã¹ããã§ã«ãã¹ãã®ç©ççéçã«è¿ã¥ããŠããããããå®éã«åé¡ã«ãªã£ãŠããå Žåã«ã®ã¿äœ¿çšããå¿ èŠããããŸãã
ã©ã³ã¿ã€ã èªåããã¥ãŒã ãªãã·ã§ã³ã¯ã§æ§æãã
postgresql.conf
ãŸããæ®å¿µãªãããé«è² è·ã·ã¹ãã ã§æ©èœããäžèœã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããã
ããŒãã«ã®ã¹ãã¬ãŒãžãªãã·ã§ã³ãå€ãã®å ŽåãããŒã¿ããŒã¹ã§ã¯ãè² è·ã®ããªãã®éšåãå°æ°ã®ããŒãã«ã«ã®ã¿ããããŸããããŒãã«ã®èªåç空èšå®ãã«ã¹ã¿ãã€ãºããããšã¯ãã·ã¹ãã ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ã®ããVACUUMãæåã§éå§ããå¿ èŠããªããããã®åªããæ¹æ³ã§ãã次ã®ã³ãã³ã
ã䜿çšããŠããŒãã«ãã«ã¹ã¿ãã€ãºã§ããŸãã
ALTER TABLE .. SET STORAGE_PARAMETER
ãããŒãã£ã³ã°ããŒãã«ïŒèšåŒµïŒ
é£æ床ïŒäœãã
æœåšçãªåœ±é¿ïŒäžãé«ã
æéã®çµéãšãšãã«ãããŒãã«ã®é床ã®è¥å€§åã«ããäžé©åãªã¯ãªãŒã³ã¢ããããªã·ãŒã«ãããã·ã¹ãã ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãããããã£ãŠãautovacuumããŒã¢ã³ãèšå®ããŠæåã§VACUUMãèµ·åããŠããåé¡ã¯è§£æ±ºããŸããããã®ãããªå Žåãpg_repackæ¡åŒµæ©èœã圹ã«ç«ã¡ãŸããpg_repack
æ¡åŒµæ©èœã䜿çšããŠãæ¬çªç°å¢ã§ããŒãã«ãšã€ã³ããã¯ã¹ãåæ§ç¯ããã³åç·šæã§ããŸãã
ããŒã¿ã®ãããã¹ããã
é£æ床ïŒé«ãã
æœåšçãªåœ±é¿ïŒäœ-äž-é«ãMySQLãš
åæ§ã«ãPostgreSQLã¯ãããã¹ããããåãé€ãããã«ããŒã¿ã¹ããªãŒã ã«äŸåããŠãããã·ã¹ãã ã®ã¢ãŒããã¯ãã£ãå€æŽããããšãããããŸãã ãŸãã次ã®ç¹ã«æ³šæããå¿ èŠããããŸãã
- ã€ã³ããã¯ã¹ãæ€çŽ¢ããåã«ã€ã³ããã¯ã¹ãããããšã確èªããŠãã ãããã·ã¹ãã ã«ã¿ãã°ãšãã¥ãŒã䜿çšããŠãã¯ãšãªãã€ã³ããã¯ã¹ã䜿çšããŠããããšãç£èŠããã³ç¢ºèªã§ããŸããpg_stat_statementããã³pgbadgeræ¡åŒµæ©èœã䜿çšããŠãã¯ãšãªã®ããã©ãŒãã³ã¹ãåæããŸãã
- ããŒãã®ã¿ã®ã¿ãã«ïŒHOTïŒãã€ã³ããã¯ã¹ãå€ãããå¯èœæ§ããããŸããæªäœ¿çšã®ã€ã³ããã¯ã¹ãåé€ããããšã§ãæœåšçãªè¥å€§åãæžãããããŒãã«ãµã€ãºãæžããããšãã§ããŸãã
- . , , . , , , . , . , , .
- . postgres. , .
- . , . . , !
é£æ床ïŒäœãã
æœåšçãªåœ±é¿ïŒé«ãã
åããã¹ãã§ã¢ããªã±ãŒã·ã§ã³ïŒPHPãJavaãPythonïŒãšpostgresãå®è¡ããããšã¯é¿ããŠãã ããããããã®èšèªã®ã¢ããªã±ãŒã·ã§ã³ãç¹ã«ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯å€§éã®RAMãæ¶è²»ããå¯èœæ§ãããããããªãœãŒã¹ãããã£ãŠããŒã¿ããŒã¹ã·ã¹ãã ãšã®ç«¶åãçºçããå šäœçãªããã©ãŒãã³ã¹ãäœäžããããã泚æããŠãã ããã
ã¬ããªã±ãŒã·ã§ã³
é£æ床ïŒäœãã
æœåšçãªåœ±é¿ïŒé«ãã
åæããã³éåæã¬ããªã±ãŒã·ã§ã³ãpostgresã®æè¿ã®ããŒãžã§ã³ã¯ãåæã¢ãŒããšéåæã¢ãŒãã®äž¡æ¹ã§è«çã¬ããªã±ãŒã·ã§ã³ãšã¹ããªãŒãã³ã°ã¬ããªã±ãŒã·ã§ã³ããµããŒãããŠããŸããããã©ã«ãã®ã¬ããªã±ãŒã·ã§ã³ã¢ãŒãã¯éåæã§ãããç¹ã«é 延ã倧ãããããã¯ãŒã¯ã§ã¯ãåæã¬ããªã±ãŒã·ã§ã³ã䜿çšããããšã®åœ±é¿ãèæ ®ããå¿ èŠããããŸãã
ãµãŒããŒç°å¢
æåŸã«ãªããŸããããããã¯ãã¹ã容éã®åçŽãªå¢å ã§ããåãªãœãŒã¹ãPostgreSQLã®ããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããããèŠãŠã¿ãŸãããã
- . , . . , , -.
- . , , . .
- . .
- -, ,
- .
- . , .
- .
- . .
- WAL-, , , . , (log shipping) , , .
: