
ã€ã³ãã
ããã€ãã®ç޹仿ãæãåºãããŠãã ããã
- PostgreSQLãµãŒããŒã®ãã°ããæ å ±ãåãåããµãŒãã¹ãæ§ç¯ããŠããŸã
- ãã°ãåéãããªã³ã©ã€ã³ã§äœãïŒè§£æãåæãè¿œå æ å ±ã®èŠæ±ïŒãè¡ããã
- åéããã³ãåæãããããã®ã¯ãã¹ãŠã©ããã«ä¿åããå¿ èŠããããŸã
æåŸã®ãã€ã³ããã€ãŸãããããã¹ãŠãPostgreSQLã¹ãã¬ãŒãžã«é ä¿¡ããæ¹æ³ã«ã€ããŠèª¬æããŸããããç§ãã¡ã®å Žåããã®ããŒã¿ã¯å ã®ããŒã¿ã®åæ°ã§ããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ãšãã©ã³ãã³ãã¬ãŒãã®ã³ã³ããã¹ãã§ã®è² è·çµ±èšããªãœãŒã¹æ¶è²»ãåäžã®ãã©ã³ããŒãã«æ£ç¢ºãªæŽŸçåé¡ã®èšç®ãããã¯ã®ç£èŠãªã©ããããŸãã
ãµãŒãã¹ã®ååã®è©³çްã«ã€ããŠã¯ããããªã¬ããŒããåç §ããèšäºãPostgreSQLã¯ãšãªã®äžæ¬æé©åããåç §ããŠãã ããã
ããã·ã¥vsãã«
ãã°ãŸãã¯ãã®ä»ã®åžžã«å°çããã¡ããªãã¯ãååŸããããã®2ã€ã®äž»èŠãªã¢ãã«ããããŸãã
- push-ãµãŒãã¹äžãç£èŠå¯Ÿè±¡ãµãŒããŒäžã«å€ãã®ãã¢ããŒãã¢ã¬ã·ãŒããŒããããŸã-äžéšã®ããŒã«ã«ãšãŒãžã§ã³ãã¯ãèç©ãããæ å ±ã宿çã«ãµãŒãã¹ã«ãã³ãããŸã
- ãã«-ãµãŒãã¹ã§ã¯ãåããã»ã¹/ã¹ã¬ãã/ coroutine / ...ã¯ã1ã€ã®ãç¬èªã®ããœãŒã¹ããã®æ å ±ã®ã¿ãåŠçããããŒã¿ã®åä¿¡ã¯ããèªäœã§éå§ãããŸãã
ãããã®åã¢ãã«ã«ã¯ããã©ã¹é¢ãšãã€ãã¹é¢ããããŸãã
æŒã
çžäºäœçšã¯ãç£èŠå¯Ÿè±¡ããŒãã«ãã£ãŠéå§ãããŸãã

...次ã®å Žåã«æçã§ãïŒ
- ããªãã¯ããããã®æ å ±æºãæã£ãŠããŸãïŒæ°åäžïŒ
- ãããã®è² è·ã¯ãããã®éã§ããŸãå·®ããªããã1rpsãè¶ ããŸãã
- è€éãªåŠçã¯å¿ èŠãããŸãã
äŸïŒåã¯ã©ã€ã¢ã³ãã®ãã£ãã·ã¥ã¬ãžã¹ã¿ããå°åæãåãåãOFDãªãã¬ãŒã¿ãŒã®åä¿¡è ã
...åé¡ãåŒãèµ·ãããŸãïŒ
- ããŸããŸãªã¹ããªãŒã ããã®ç£èŠãªããžã§ã¯ãã®ã³ã³ããã¹ãã§èŸæž/åæ/éèšãæžã蟌ãããšãããšãã®ããã¯/ãããããã¯
- åBLããã»ã¹ã®ãã£ãã·ã¥ã®ææªã®äœ¿çšç/ããŒã¿ããŒã¹ãžã®æ¥ç¶-ããšãã°ãããŒã¿ããŒã¹ãžã®åãæ¥ç¶ãæåã«1ã€ã®ããŒãã«ãŸãã¯ã€ã³ããã¯ã¹ã»ã°ã¡ã³ãã«æžã蟌ã¿ãããã«å¥ã®ã»ã°ã¡ã³ãã«æžã蟌ãå¿ èŠããããŸã
- åãœãŒã¹ã«ç¹å¥ãªãšãŒãžã§ã³ããé 眮ããå¿ èŠãããããããœãŒã¹ã®è² è·ãå¢å ããŸã
- ãããã¯ãŒã¯çžäºäœçšã®ãªãŒããŒããããé«ã-ããããŒã¯ããœãŒã¹ãžã®æ¥ç¶å šäœã§ã¯ãªããåãã±ããã®éä¿¡ããçµã³ä»ãããå¿ èŠããããŸã
åŒã
ã€ãã·ãšãŒã¿ãŒã¯ãã³ã¬ã¯ã¿ãŒã®ç¹å®ã®ãã¹ã/ããã»ã¹/ã¹ã¬ããã§ãããããŒããããèªäœã«ããã€ã³ãããããã¿ãŒã²ãããããç¬ç«ããŠããŒã¿ãååŸããŸãã

...次ã®å Žåã«æçã§ãïŒ
- ãœãŒã¹ãã»ãšãã©ãããŸããïŒæ°åäžïŒ
- ã»ãšãã©ã®å Žåããããããã®è² è·ãããã1Krpsã«éããããšããããŸã
- ãœãŒã¹ã«ããã»ã°ã¡ã³ããŒã·ã§ã³ã䌎ãè€éãªåŠçãå¿ èŠ
äŸïŒåååŒãã©ãããã©ãŒã ã®ã³ã³ããã¹ãã§ã®ååŒã®ããŒããŒ/ã¢ãã©ã€ã¶ãŒã
...åé¡ãåŒãèµ·ãããŸãïŒ
- 2ã€ã®åä¿¡è éã§ãã¹ãã¢ãã§ããªãããã1ã€ã®ãœãŒã¹ã1ã€ã®ããã»ã¹ïŒCPUã³ã¢ïŒã§åŠçããããã®ãªãœãŒã¹ã®å¶é
- ãœãŒã¹ããã®è² è·ãæ¢åã®ããã»ã¹/ã¹ã¬ãã/ãªãœãŒã¹å šäœã«åçã«å忣ããã³ãŒãã£ããŒã¿ãŒãå¿ èŠã§ã
PostgreSQLãç£èŠãããšãã®è² è·ã¢ãã«ã¯æããã«ãã«ã¢ã«ãŽãªãºã ã«åŒãå¯ãããã1ã€ã®ããã»ã¹ã®ãªãœãŒã¹ãšææ°ã®CPUã®ã«ãŒãã«ã¯ã1ã€ã®ãœãŒã¹ã«å¯ŸããŠååã§ãããããããã§åæ¢ããŸããã
ãã«ãã«ãã°
ãµãŒããŒãšã®éä¿¡ã¯ãéåžžã«å€ãã®ãããã¯ãŒã¯æäœãæäŸããslaboformatirovannymiããã¹ãæååãåŠçãããããã³ã¬ã¯ã¿ãŒã³ã¢ãšããŠJavaScriptã¯ãµãŒããŒNode.jsãšããŠã®åœŒã®å身ã§å®ç§ã«ãªããŸããã
ãµãŒããŒãã°ããããŒã¿ãååŸããããã®æãç°¡åãªè§£æ±ºçã¯ãåçŽãªlinuxã³ãã³ãã䜿çšããŠãã°ãã¡ã€ã«å šäœãã³ã³ãœãŒã«ã«ããã©ãŒãªã³ã°ãããããšã§ããããšã倿ããŸãã
tail -F <current.log>ãç§ãã¡ã®ã³ã³ãœãŒã«ã ããåçŽã§ã¯ãããŸããããä»®æ³ã§ã-SSHãããã³ã«ãä»ããŠæ¡åŒµããããµãŒããŒãžã®å®å
šãªæ¥ç¶ã®å
éšã

ãããã£ãŠãSSHæ¥ç¶ã®2çªç®ã®åŽã«ããã³ã¬ã¯ã¿ãŒã¯ããã¹ãŠã®ãã°ãã©ãã£ãã¯ã®å®å šãªã³ããŒãå ¥åãšããŠåãåããŸãããŸããå¿ èŠã«å¿ããŠããµãŒããŒã«çŸåšã®ç¶æ³ã«é¢ããæ¡åŒµã·ã¹ãã æ å ±ãèŠæ±ããŸãã
ãªãsyslogããªãã®ã§ãã
äž»ãªçç±ã¯2ã€ãããŸãã
syslogããã·ã¥ã¢ãã«ã§åäœãããããåä¿¡ãã€ã³ãã§çæãããã¹ããªãŒã ã®åŠçè² è·ãè¿ éã«ç®¡çããããšã¯ã§ããŸãããã€ãŸãããã¹ãã®ãã¢ãçªç¶æ°åã®é ãèŠæ±ã®èšç»ããæ³šã蟌ã¿ãå§ããå Žåããããã®åŠçãç°ãªãããŒãéã§åé¢ããããšã¯éåžžã«å°é£ã§ãã
ããã§ã®åŠçã¯ããã°ã®ãã°ããããåä¿¡/è§£æã§ã¯ãªããèšç»ãè§£æããåããŒãã®å®éã®ãªãœãŒã¹åŒ·åºŠãèšç®ããããšãæå³ããŸãã- PostgreSQL, , «» (relation/page/tuple/...).
«DBA: ».
-
ååãšããŠããã°ããè§£æãããããŒã¿ãæ ŒçŽããããã®DBMSãšããŠä»ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸããã150ã200GB /æ¥ã®åä¿¡æ å ±ã®éã¯ãæäœã®äœå°ãããŸãæ®ããŸããããã®ãããã¹ãã¬ãŒãžãšããŠPââostgreSQLãéžæããŸããã
-ãã°ãä¿åããããã®PostgreSQLïŒçå£ã«ïŒ
-ãŸããããŸããŸãªåæè¡šçŸã»ã©å€ãã®ãã°ã¯ãããŸããã第äºã«ããããªãã¯ãããã調çããæ¹æ³ãããããªãã ãã§ãïŒã:)

ãµãŒããŒèšå®
ãã®ç¹ã¯äž»èгçãªãã®ã§ãããããŒããŠã§ã¢ã«å€§ããäŸåããŸãããã¢ã¯ãã£ããªèšé²çšã«PostgreSQLãã¹ããæ§æããããã«ã次ã®ååãäœæããŸããã
ãã¡ã€ã«ã·ã¹ãã ã®èšå®
æžã蟌ã¿ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããæãéèŠãªèŠå ã¯ãããŒã¿ããŒãã£ã·ã§ã³ã®[æ£ãããªã]ããŠã³ãã§ããæ¬¡ã®ã«ãŒã«ãéžæããŸããã
- PGDââATAãã£ã¬ã¯ããªã¯ãã©ã¡ãŒã¿ã§ããŠã³ããããŸãïŒext4ã®å ŽåïŒ
noatime,nodiratime,barrier=0,errors=remount-ro,data=writeback,nobh - ãã£ã¬ã¯ããªPGDââATA / pg_stat_tmpã¯ã«ç§»åãããŸã
tmpfs - PGDââATA / pg_walãã£ã¬ã¯ããªããããŠç§»åãããããåççã§ããå Žåãä»ã®ã¡ãã£ã¢ã«
PostgreSQLãã¡ã€ã«ã·ã¹ãã ã®ãã¥ãŒãã³ã°
ã åç §ããŠãã ãããæé©ãªI / Oã¹ã±ãžã¥ãŒã©ãŒã®
éžæããã©ã«ãã§ã¯ãå€ãã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã
cfqãRedHatããã³CentOSã§ããã¹ã¯ããããçšã«ã·ã£ãŒãåãããI / Oã¹ã±ãžã¥ãŒã©ãŒãéžæããŠããŸãnoopãããããããã¯ç§ãã¡ã«ãšã£ãŠããæçšã§ããããšã倿ããŸããdeadlineãPostgreSQLãšã
åç §ããŠãã ãããI / Oã¹ã±ãžã¥ãŒã©ãŒïŒcfqãnoopãããã³æéïŒ
ãããŒãã£ããã£ãã·ã¥ã®ãµã€ãºã®åæž
ãã®ãã©ã¡ãŒã¿ãŒ
vm.dirty_background_bytesã¯ããã£ãã·ã¥ã®ãµã€ãºããã€ãåäœã§èšå®ããŸãããã®ãã©ã¡ãŒã¿ãŒã«éãããšãã·ã¹ãã ã¯ãã£ãã·ã¥ããã£ã¹ã¯ã«ãã©ãã·ã¥ããããã¯ã°ã©ãŠã³ãããã»ã¹ãéå§ããŸããåæ§ã§ãããçžäºã«æä»çãªãã©ã¡ãŒã¿ããããŸããããã¯ãvm.dirty_background_ratioåèšã¡ã¢ãªãµã€ãºã®ããŒã»ã³ããŒãžãšåãå€ãèšå®ããŸããããã©ã«ãã§ã¯ãã...ãã€ããã§ã¯ãªãèšå®ãããŸãã
ã»ãšãã©ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯10ïŒ ãCentOSã§ã¯5ïŒ ã§ããããã¯ãåèšãµãŒããŒã¡ã¢ãªã16GBã®å Žåãã·ã¹ãã ãäžåºŠã«850MBãè¶ ããããŒã¿ããã£ã¹ã¯ã«æžã蟌ãããšããå¯èœæ§ãããããšãæå³ãããã®çµæãIOpsã®è² è·ãããŒã¯ã«ãªããŸãã
èšé²ã®ããŒã¯ãæ»ããã«ãªãå§ãããŸã§ãå®éšçã«æžå°ãããŸããçµéšäžãã¹ãã€ã¯ãåé¿ããããã«ããµã€ãºã¯æå€§ã¡ãã£ã¢ã¹ã«ãŒãããïŒIOpsåäœïŒã«ã¡ã¢ãªããŒãžãµã€ãºãæããå€ãããå°ããããå¿ èŠããããŸããã€ãŸããããšãã°ã7K IOpsïŒã7000 x 4096ïŒã®å Žå-çŽ28MBã§ããpostgresql.confã®PostgreSQLæé©åèšå®çšã®Linuxã«ãŒãã«ãªãã·ã§ã³ã®æ§æã
åç §ããŠãã ããã
èšé²ãã¹ããŒãã¢ããããããã«ãããããã©ã®ãã©ã¡ãŒã¿ã衚瀺ããå¿ èŠããããŸãããããã«ãããã®ã¯ãã¹ãŠçŽç²ã«å人çãªãã®ãªã®ã§ããã®ãããã¯ã«ã€ããŠããã€ãèããŸãã
shared_buffers-ç¹ã«éè€ãããå ±éãããŒã¿ã察象ã«èšé²ãããšãããã»ã¹ãçºçããªããããå°ããããå¿ èŠããããŸããsynchronous_commit = off-RAIDã³ã³ãããŒã©ãŒã®ããããªãŒãä¿¡é ŒããŠããå Žåã¯ããã€ã§ãã³ãããæžã蟌ã¿ã®åŸ æ©ãç¡å¹ã«ã§ããŸãfsync-ããŒã¿ããŸã£ããéèŠã§ãªãå Žåã¯ããªãã«ããããšãã§ããŸã-ãå¶éå ãã§ã¡ã¢ãªå DBãååŸããããšãã§ããŸã
ããŒã¿ããŒã¹ããŒãã«ã®æ§é
ç©çããŒã¿ã¹ãã¬ãŒãžã®æé©åã«é¢ããããã€ãã®èšäºããã§ã«å ¬éããŠããŸãã
- ããŒãã«ã®ããŒãã£ã·ã§ã³åå²ã«ã€ããŠ- ããµãã©ã€ãã§PostgreSQLã«æžã蟌ã¿ãŸãïŒ1ãã¹ãã1æ¥ã1TBã
- TOASTèšå®ã«ã€ããŠ- ãPostgreSQLã®å€§å®¹éã§å€ãã®ãéãç¯çŽããã
ããããããŒã¿å ã®ããŸããŸãªããŒã«ã€ããŠã¯ããŸã ãããŸããã§ããããããã«ã€ããŠã話ãããŸãã
å€éšããŒã¯ãæžã蟌ã¿ãå€ãã·ã¹ãã ã«ãšã£ãŠã¯æªã§ããå®éããããã¯ãäžæ³šæãã§ãããäžæ³šæãªããã°ã©ããŒãããŒã¿ããŒã¹ã«ããã¹ãã§ã¯ãªããã®ãããŒã¿ããŒã¹ã«æžã蟌ãããšãèš±å¯ããŸããã
å€ãã®éçºè ã¯ãããŒã¿ããŒã¹ããŒãã«ãèšè¿°ããã¬ãã«ã§è«ççã«é¢é£ããããžãã¹ãšã³ãã£ãã£ãFKãä»ããŠãªã³ã¯ããå¿ èŠããããšããäºå®ã«æ £ããŠããŸããããããããã§ã¯ãããŸããïŒ
ãã¡ããããã®ç¹ã¯ãããŒã¿ããŒã¹ã«ããŒã¿ãæžã蟌ããšãã«èšå®ããç®æšã«å€§ããäŸåããŸããããªããéè¡ã§ã¯ãªãå ŽåïŒãããŠããªããéè¡ã§ãããå Žåã¯åŠçããŠããŸããïŒïŒããããŒã©ã€ãããŒã¿ããŒã¹ã§ã®FKã®å¿ èŠæ§ã¯çãããã§ãã
ãæè¡çã«ãåFKã¯ãã¬ã³ãŒããæ¿å ¥ãããšãã«åå¥ã®SELECTãäœæããŸãåç §ãããããŒãã«ãããããã§ãã¢ã¯ãã£ãã«äœæããŠããããŒãã«ãèŠãŠã2ã3åã®FKãã¶ãäžãã£ãŠããŠãç¹å®ã®ã¿ã¹ã¯ãããã©ãŒãã³ã¹ã3ã4åäœäžããããããªæŽåæ§ãæäŸãã䟡å€ããããã©ãããè©äŸ¡ããŸã...ãŸãã¯å€ã«ããè«çæ¥ç¶ã§ååã§ããïŒããã§ãã¹ãŠã®FKãåé€ããŸããã
UUIDããŒã¯è¯ãã§ããç¡é¢ä¿ãªç°ãªããã€ã³ãã§çæãããUUIDã®è¡çªã®å¯èœæ§ã¯éåžžã«å°ããããããã®è² è·ïŒããã€ãã®ä»£çIDãçæããããšã«ããïŒã¯ãããŒã¿ããŒã¹ãããæ¶è²»è ãã«å®å šã«åãé€ãããšãã§ããŸããUUIDã®äœ¿çšã¯ãæ¥ç¶ãããéåæåæ£ã·ã¹ãã ã§ã¯è¯ãç¿æ £ã§ãã
PostgreSQLã®äžæã®èå¥åã®ä»ã®ããªãšãŒã·ã§ã³ã«ã€ããŠã¯ããPostgreSQLã¢ã³ããã¿ãŒã³ïŒäžæã®èå¥åãã®èšäºãåç §ããŠãã ããã
è€æ°ã®ãã£ãŒã«ãã§æ§æãããŠããå Žåã§ããããã¥ã©ã«ããŒãé©ããŠããŸããè€åããŒã§ã¯ãªãã远å ã®ä»£çPKãã£ãŒã«ããšãããŒããããããŒãã«å ã®ãã®ã€ã³ããã¯ã¹ãæããå¿ èŠããããŸããããã¯ããªããŠãç°¡åã«å®è¡ã§ããŸãã
åæã«ãã¢ãããŒãã®çµã¿åãããçŠæ¢ãã人ã¯èª°ãããŸãããäŸãã°ãæã ãæã£ãŠããã«å²ãåœãŠããã代çUUID 1å ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«é¢é£ããã·ãŒã±ã³ã·ã£ã«ãã°ãšã³ããªã®ããããããããã¢ã¯PKãšããŠäœ¿çšãããŠããïŒååšããªãåãªãèªç¶ããŒã§ããããïŒ
(pack::uuid, recno::int2)ãrecnoããã®ãèªç¶ãªãã·ãŒã±ã³ã¹çªå·ãããå
ã®ã¬ã³ãŒãã
ããšã³ãã¬ã¹ãCOPYã¹ããªãŒã
OCãšåæ§ã«ãPostgreSQLã¯ãããŒã¿ã倧éã®ãããïŒ
INSERT1000è¡ãªã©ïŒã§æžã蟌ãŸããå Žåããæ°ã«å
¥ããªããã®ã§ãããã ãCOPYããã©ã³ã¹ã®åããæžã蟌ã¿ã¹ããªãŒã ïŒããïŒã«å¯ŸããŠã¯ã¯ããã«èæ§ããããŸãããããã圌ãã¯éåžžã«æ³šææ·±ã調çã§ããªããã°ãªããŸããã

- åã®æ®µéã§ãã¹ãŠã®FKãåé€ããã®ã§ãä»ã§ã¯ãããèªäœ
packãšé¢é£ããFKã®ã»ããã«é¢ããæ å ±ãreordä»»æã®é åºã§éåæã«æžã蟌ãããšãã§ããŸãããã®å Žåãåã¿ãŒã²ããããŒãã«ã«å¯ŸããŠåžžã«ã¢ã¯ãã£ããªCOPYãã£ãã«ãç¶æããããšãæã广çã§ãã - , , «», ( â
COPY-) . , â 100, . - , , . . .
, , «» , . , . - , node-pg, PostgreSQL Node.js, API â
stream.write(data)COPY-true, ,false, .

, , « »,COPY. -
COPY- LRU «». .

ããã§ããã°ã®èªã¿åããšæžã蟌ã¿ã®ãã®ã¹ããŒã ã§åŸãããäž»ãªå©ç¹ã«æ³šæããå¿ èŠããããŸããããŒã¿ããŒã¹ã§ã¯ãæ°ç§åŸã«ãäºå®ããã»ãŒãªã³ã©ã€ã³ã§åæã§ããããã«ãªããŸãã
ãã¡ã€ã«ã«ããçµã蟌ã¿
ãã¹ãŠãè¯ãããã§ããåã®ã¹ããŒã ã®ãã¬ãŒããã¯ã©ãã«ãããŸããïŒç°¡åã«å§ããŸããã...
ãªãŒããŒã·ã³ã¯
ããŒããããã·ã¹ãã ã®å€§ããªåé¡ã®1ã€ã¯ããããå¿ èŠãšããªãäžéšã®æäœã®éå°åæã§ããã圌ããæ°ã¥ããªãã£ãããããããã®æ¹ãç°¡åã ã£ããå ŽåããããŸãããé ããæ©ãããããåãé€ãå¿ èŠããããŸãã
ããã¯ç°¡åã«å®çŸã§ããŸããç£èŠçšã«çŽ1000å°ã®ãµãŒããŒããã§ã«èšå®ããŠãããåãµãŒããŒã¯åå¥ã®è«çã¹ã¬ããã«ãã£ãŠåŠçãããåã¹ã¬ããã¯æ¬¡ã®ããã«ç¹å®ã®é »åºŠã§ããŒã¿ããŒã¹ã«éä¿¡ããããã«èç©ãããæ å ±ããã³ãããŸãã
setInterval(writeDB, interval)
ããã§ã®åé¡ã¯ããã¹ãŠã®ã¹ããªãŒã ãã»ãŒåæã«éå§ãããšããäºå®ã«æ£ç¢ºã«ãããŸãããã®ãããã¹ããªãŒã ãéä¿¡ããç¬éã¯ãã»ãšãã©ã®å Žåãããã€ã³ãã«ãäžèŽããŸãã

幞ããªããšã«ãããã¯ç°¡åã«ä¿®æ£ã§ããŸããéå§æå»ãšééã®äž¡æ¹ã«ãã©ã³ãã ãªãæéééã远å ããããšã§ã次ã®ããã«ãªããŸãã
setInterval(writeDB, interval * (1 + 0.1 * (Math.random() - 0.5)))

ãã®æ¹æ³ã§ã¯ãèšé²ã®è² è·ãçµ±èšçã«ã忣ããããŠãã»ãŒåäžã«ããããšãã§ããŸãã
CPUã³ã¢ã«ããã¹ã±ãŒãªã³ã°
è² è·å šäœã«å¯ŸããŠ1ã€ã®ããã»ããµã³ã¢ã§ã¯æããã«äžååã§ãããã¯ã©ã¹ã¿ã¢ãžã¥ãŒã«ã¯ããã§åœ¹ç«ã¡ãŸããããã«ãããåããã»ã¹ã®äœæãç°¡åã«ç®¡çããIPCãä»ããŠããããšéä¿¡ã§ããŸãã
ããã§ã16åã®ããã»ããµã³ã¢ã«å¯ŸããŠ16åã®åããã»ã¹ãã§ããŸãããããã§ãCPUå šäœã䜿çšã§ããŸãããã ããåããã»ã¹ã§16åã®ã¿ãŒã²ãããã¬ãŒãã«æžã蟌ã¿ãããŒã¯è² è·ãçºçãããšã远å ã®COPYãã£ãã«ãéããŸããã€ãŸããåžžã«256以äžã®ã¢ã¯ãã£ããªæžã蟌ã¿ã¹ã¬ããã«åºã¥ããŠããŸã...ããïŒãã®ãããªæ··ä¹±ã¯ãã£ã¹ã¯ã®ããã©ãŒãã³ã¹ã«è¯ã圱é¿ãäžãããããŒã¹ãçãå§ããŸããã
ããã¯ãããã€ãã®äžè¬çãªèŸæžïŒããšãã°ãç°ãªãããŒãããéä¿¡ãããåãèŠæ±ããã¹ãïŒãæžãçããããšãããšãã«ç¹ã«æ²ããã£ãã§ããäžèŠãªããã¯ãåŸ æ©äž...

ç¶æ³ããè£è¿ãããŸããããã€ãŸããåããã»ã¹ããœãŒã¹ããæ å ±ãåéããŠåŠçããããã«ããŸãããããŒã¿ããŒã¹ã«ã¯æžã蟌ãŸãªãã§ãã ããã代ããã«ãIPCãä»ããŠãã¹ã¿ãŒã«ã¡ãã»ãŒãžãéä¿¡ãããŠãã ããã圌ã¯ãã§ã«å¿ èŠãªå Žæã«äœããæžããŠããŸãã

åã®æ®µèœã®ã¹ããŒã ã§åé¡ãããã«èŠã人ã¯èª°ã§ã-ãããã£ãããã¹ã¿ãŒãéããããªãœãŒã¹ãæã€ããã»ã¹ã§ãããã®ã¯ãŸãã«ãã®ç¬éã§ãããããã£ãŠãããæç¹ã§ã圌ããã§ã«æžã蟌ã¿ãéå§ããŠããããšãçºèŠããŸãããããã¯ã1ã€ã®CPUã³ã¢ã®ãªãœãŒã¹ã«ãã£ãŠãå¶éãããŠããããããã¹ãŠã®ã¹ã¬ãããããŒã¿ããŒã¹ã«ã·ããããããšãžã®å¯ŸåŠã忢ããã ãã§ãããã®çµæãæãè² è·ã®å°ãªããèŸæžãã¹ããªãŒã ã®ã»ãšãã©ããã¹ã¿ãŒãä»ããŠæžã蟌ãããã«ããæãè² è·ã®é«ãã远å ã®åŠçãå¿ èŠãšããªããã®ãã¯ãŒã«ãŒã«è¿ããŸããã

ãã«ãã³ã¬ã¯ã¿ãŒ
ãã ãã1ã€ã®ããŒãã§ãã䜿çšå¯èœãªãã¹ãŠã®è² è·ãåŠçããã«ã¯äžååã§ããç·åœ¢ã¹ã±ãŒãªã³ã°ã«ã€ããŠèãããšããæ¥ãŸããã解決çã¯ããããã«ã³ãŒãã£ããŒã¿ãŒãé 眮ããè² è·ã«å¿ãããã«ãã³ã¬ã¯ã¿ãŒã®èªåãã©ã³ã·ã³ã°ã§ããã

åãã¹ã¿ãŒã¯ããã¹ãŠã®ã¯ãŒã«ãŒã®çŸåšã®è² è·ãèªåã«ãã³ãããããã«å¿ããŠãã©ã®ããŒãã®ç£èŠãå¥ã®ã¯ãŒã«ãŒãŸãã¯å¥ã®ã³ã¬ã¯ã¿ãŒã«è»¢éãããã«ã€ããŠã®æšå¥šäºé ãåãåããŸãããã®ãããªãã©ã³ã·ã³ã°ã¢ã«ãŽãªãºã ã«é¢ããå¥ã®èšäºããããŸãã
ããŒãªã³ã°ãšãã¥ãŒå¶é
æ¬¡ã®æ£ãã質åã¯ãçªç¶ã®ããŒã¯è² è·ãçºçãããšãã«æžã蟌ã¿ã¹ããªãŒã ãã©ããããã§ãã
çµå±ã®ãšãããããŒã¹ãžã®æ°ããæ¥ç¶ãééãªãéãããšã¯ã§ããŸããã广ããªãã圹ã«ç«ã¡ãŸãããç°¡åãªè§£æ±ºç-ã¿ãŒã²ããããŒãã«ããšã«åæã«ã¢ã¯ãã£ããªã¹ã¬ããã16åãè¶ ããªãããã«å¶éããŸãããããããããŸã ãæžã蟌ãæéããªãã£ããããŒã¿ãã©ããããïŒ..
ãã®è² è·ã®ãæ¥å¢ããæ£ç¢ºã«ããŒã¯ãã€ãŸãçæã§ããå Žåãã³ã¬ã¯ã¿ãŒèªäœã®ã¡ã¢ãªãŒã®ãã¥ãŒã«ããŒã¿ãäžæçã«ä¿åã§ããŸããããŒã¹ãžã®ãã£ãã«ãè§£æŸããããšããã«ããã¥ãŒããã¬ã³ãŒããååŸããŠã¹ããªãŒã ã«éä¿¡ããŸãã
ã¯ããããã«ã¯ãã³ã¬ã¯ã¿ãŒã«ãã¥ãŒãæ ŒçŽããããã®ãããã¡ãŒãå¿ èŠã§ãããããã¯ããªãå°ãããããã«è§£æŸãããŸãã

ãã¥ãŒã®åªå é äœ
åã®åçãèŠãŠããæ³šææ·±ãèªè ã¯ããã¡ã¢ãªãå®å šã«äœ¿ãæãããããšãã«äœãèµ·ããã®ãïŒ..ããšåã³æžæããŸããããã§ã«ããã€ãã®éžæè¢ããããŸã-誰ããç ç²ã«ããå¿ èŠããããŸãã
ããããããŒã¿ããŒã¹ã«é ä¿¡ããããã¹ãŠã®ã¬ã³ãŒãããåçã«åœ¹ç«ã€ãããã§ã¯ãããŸãããããããã§ããã ãå€ããå®éçã«æžãçããããšã¯ç§ãã¡ã®å©çã§ããæžãããæååã®ãµã€ãºã«ããåå§çãªãææ°åªå é äœä»ããã¯ãããã«åœ¹ç«ã¡ãŸãã
let priority = Math.trunc(Math.log2(line.length));
queue[priority].push(line);
ãããã£ãŠããã£ãã«ã«æžã蟌ããšãã¯ãåžžã«ãäžäœãã®ãã¥ãŒãããããäžãå§ããŸããã€ãŸããåè¡ãçããªã£ãŠããã ãã§ãããå®éçã«éä¿¡ã§ããŸãã
let qkeys = Object.keys(queue);
qkeys.sort((x, y) => x.valueOf() - y.valueOf()); // - - !
éå¡ãæã¡è² ãã
ããã§ã¯ã2ã€ã®ã¹ãããã«æ»ããŸãããããã®æãŸã§ã«ã1ã€ã®ããŒãã«ã®ã¢ãã¬ã¹ã«æå€§16ã®ã¹ã¬ãããæ®ãããšã«ããŸãããã¿ãŒã²ããããŒãã«ããã¹ããªãŒãã³ã°ãã§ããå Žåãã€ãŸãã¬ã³ãŒããçžäºã«çžé¢ããŠããªãå Žåããã¹ãŠãæ£åžžã§ããæå€§-ãã£ã¹ã¯ã¬ãã«ã§ãç©ççãããã¯ããããŸãã
ãã ãããããéèšã®ããŒãã«ãŸãã¯ãèŸæžãã§ããå Žåãç°ãªãã¹ããªãŒã ããåãPKã䜿çšããŠè¡ãæžã蟌ãããšãããšãããã¯ã®åŸ æ©ããŸãã¯ãããããã¯ãçºçããŸããããã¯æ²ããã§ã...
ããããçµå±ã®ãšãããäœãæžãã¹ãã-ç§ãã¡ã¯èªåèªèº«ãå®çŸ©ããŸãïŒéèŠãªç¹ã¯ãç°ãªãå Žæãã1ã€ã®PKãæžã蟌ãããšããªãããšã§ãã
ã€ãŸãããã¥ãŒãæž¡ããšããã®ãããªPKã䜿çšããŠãããã¹ã¬ããããã§ã«åãããŒãã«ã«æžã蟌ãã§ãããã©ãããããã«ç¢ºèªããŸãïŒãã¹ãŠã1ã€ã®ããã»ã¹ã®å ±éã¢ââãã¬ã¹ã¹ããŒã¹ã«ããããšãèŠããŠããŸãïŒãããã§ãªãå Žåã¯ãèªåã§ååŸããŠã¡ã¢ãªå ã®èŸæžã«ãèªåã§ãæžã蟌ã¿ãŸãããã§ã«ä»ã®äººã®ãã®ã§ããå Žåã¯ããã¥ãŒã«å ¥ããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã®æåŸã«ãèŸæžããæ·»ä»ãã¡ã€ã«ããèªåèªèº«ã«ããã¯ãªãŒã³ã¢ãããããã ãã§ãã
å°ãã®èšŒæ
ãŸããLRUã䜿çšãããšããæåã®ãæ¥ç¶ãšããããæäŸããPostgreSQLããã»ã¹ã¯ãã»ãšãã©ã®å Žåãåžžã«å®è¡ãããŸããããã¯ãOSãCPUã³ã¢éã§ããããåãæ¿ããé »åºŠãã¯ããã«å°ãªããããŠã³ã¿ã€ã ãæå°éã«æããããšãæå³ããŸãã

次ã«ããµãŒããŒåŽã§ã»ãŒåžžã«åãããã»ã¹ãæäœããŠããå Žåã2ã€ã®ããã»ã¹ãåæã«ã¢ã¯ãã£ãã«ãªãå¯èœæ§ãå€§å¹ ã«æžå°ããŸãããããã£ãŠãCPUå šäœã®ããŒã¯è² è·ãæžå°ããŸãïŒå·Šãã2çªç®ã®ã°ã©ãã®ç°è²ã®é åïŒã ïŒãããŠLAã¯ãé çªãåŸ ã£ãŠããããã»ã¹ãå°ãªãããã«äœäžããŸãã

ããã仿¥ã®ãã¹ãŠã§ãã
ãŸããexplain.tensor.ruã䜿çšãããšãã¯ãšãªå®è¡èšç»ãèŠèŠåããããã®ããŸããŸãªãªãã·ã§ã³ã確èªã§ããããšãæãåºããŠãã ãããããã¯ãåé¡ã®ããé åãèŠèŠçã«ç¢ºèªããã®ã«åœ¹ç«ã¡ãŸãã