ãã®è³æã¯ã12æã®HolyJS 2017ã¢ã¹ã¯ã¯äŒè°ã®Grid Dynamicsã®Nikolai Matvienkoã«ããã¬ããŒãã®è»¢åã«åºã¥ããŠããŸãã
蚺æããŒã«ã®é²åã®çŸåšã®æ®µéãç解ããã«ã¯ãæŽå²ã«ç®ãåããããšããå§ãããŸãã ã¿ã€ã ã©ã€ã³ã§ãæãéèŠãªãã€ã³ããæããŸããã
æåã«ãDTraceãInstrumentsãperfãªã©ã®ããŒã«ããªãªãŒã¹ãããŸããããããã¯Node.jsããããã£ãšåã«ç»å Žããã·ã¹ãã ãããã¡ã€ã©ãŒã§ãããçŸåšã§ã䜿çšãããŠããŸãã Node.jsã®ç»å Žã«ãããããŒãæåã®ããŒã«ãç»å ŽããŸãããããã§ã¯ãããŒãã€ã³ã¹ãã¯ã¿ãŒãnode-heapdumpãnode-memwatchã«æ³šç®ãã䟡å€ããããŸãã ãã®æéãç°è²ã§ããŒã¯ããæ¡ä»¶ä»ãã§åé¡æéãšåŒã³ãŸãã ã³ãã¥ããã£ã«ã¯åè£ããã£ãããšãæãåºããŠãã ãããåœæãio.jsã¯Node.jsããåé¢ãããŠãããã³ãã¥ããã£ã¯æ¬¡ã«é²ãã¹ãå Žæãšéžæãã¹ããã®ã«ã€ããŠå ±éã®ç解ãæã£ãŠããŸããã§ããã ãããã2015幎ã«io.jsãšNode.jsãå䜵ããNode.js v4 Argonãç»å ŽããŸããã ã³ãã¥ããã£ã«ã¯éçºã®æ確ãªãã¯ã¿ãŒããããå®çšŒåäžã®Node.jsã¯AmazonãNetflixãAlibabaãªã©ã®å€§äŒæ¥ã䜿çšãå§ããŸããã
ãããŠãæ¬çªç°å¢ã§åäœããæºåãã§ããŠããå¹æçãªããŒã«ã人æ°ãåããŠããŸãã
2017幎以æ¥ãç§ã¯æ¡ä»¶ä»ãã§3çªç®ã®æ®µéãåºå¥ããŠããŸãã
ãã®æç¹ãããNode.jsã¯ãã§ã«å®æ§çã«éçºãããŠããŸãã Turbofanãžã®å®å šãªç§»è¡ãšéåæããã¯ã®éçºã«æ³šç®ãã䟡å€ããããŸãã
2015幎ã«ãNode.jsããŒãžã§ã³0.12ã§ãªãªãŒã¹ããªãªãŒã¹ããæåã«4çªç®ã®ããŒãžã§ã³ã«ããã®åŸ6çªç®ã«åŸã ã«æŽæ°ããŸããã çŸåšã8çªç®ã®ããŒãžã§ã³ãžã®ç§»è¡ãèšç»ããŠããŸãã
ãªãªãŒã¹å¹Žã«ã¯ã第äžæ®µéã®ããŒã«ã䜿çšããŸããããæ¬çªç°å¢ã§ã®äœæ¥ã«ã¯æ©èœããŸããã§ããã ç§ãã¡ã¯ç¬¬2段éã®ããŒã«ã䜿çšããçµéšãè±å¯ã§ãçŸåšã¯ç¬¬3段éã®ããŒã«ã䜿çšããŠããŸãã ããããNode.jsã®æ°ããããŒãžã§ã³ãžã®ç§»è¡ã«äŒŽããæçšãªããŒã«ã®ãµããŒãã倱ãããŠãããšããäºå®ã«çŽé¢ããŠããŸãã å®éãç§ãã¡ã¯éžæã«çŽé¢ããŸããã ãŸãã¯ãæ°ããããŒãžã§ã³ã®Node.jsã«ç§»è¡ããŸããããã¯ã以åã®ããŒãžã§ã³ãããæé©åããã³é«éåãããŠããŸãããããŒã«ããªãã蚺æã§ããŸããã ãŸãã¯ãå€ãããŒãžã§ã³ã®Node.jsã«ãšã©ãŸããåäœãé ããªããŸããããã®ããã®ããŒã«ãããããã®åŒ±ç¹ãç¥ã£ãŠããŸãã ãŸãã¯ãæ°ããããŒã«ã衚瀺ããããšãã«3çªç®ã®ãªãã·ã§ã³ãããããããã¯ãããšãã°ãNode v4以éããµããŒããã以åã®ããŒã«ã¯ãµããŒãããŸããã
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãNode.jsã¢ããªã±ãŒã·ã§ã³ïŒWeb UIããã¯ãšã³ããšNode.jsãã€ã¯ããµãŒãã¹ïŒããšã³ã¿ãŒãã©ã€ãºã¢ãŒããã¯ãã£ã®äžå¿çãªå Žæãå ãã倧èŠæš¡ãªeã³ããŒã¹ãããžã§ã¯ãã§ãã
ãã®å Žæã®åé¡ã¯ãããããæ¹åããçããå¯èœæ§ããããŸãã ãã©ãã¯ãã©ã€ããŒãªã©ã®ã¯ãŒã¯ããŒããå¢å ããŠããæ¥ã§ãäŒæ¥ãæ°æ¥ã§å¹Žéå©çã®60ïŒ ã皌ãå Žåãé«ã垯åå¹ ãç¶æããããšãç¹ã«éèŠã§ãã äœããã®äžå ·åãçºçããå Žåã¯ãNode.jsã®ç§ãå«ããã·ã¹ãã ã®ãã¹ãŠã®ãªãŒããŒãåå ããããŒã«ã«ã³ã³ãµã«ãã£ã³ã°ãéå¬ãããŸãã åé¡ãNode.jsã®åŽã«ããå ŽåãäŒç€Ÿã¯1åãããæ°åãã«ã倱ã£ãŠãããããæŠç¥ããã°ããéžæãããã®ããŒã«ãéžæããŠåé¡ãä¿®æ£ããå¿ èŠããããŸãã
以äžã«ããšã©ãŒãã¡ã¢ãªãªãŒã¯ãããã©ãŒãã³ã¹ã®äœäžãçºçããå Žåã«æ¬çªç°å¢ã§ã©ã®ããã«åäœããããå ·äœçãªäŸã瀺ããŠèª¬æããŸãã
æ¬çªç°å¢ã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ãããã°
æ¬çªç°å¢ã§ãããã°ããããã®ã¡ãã»ãŒãžãããã€ããããŸãã
ç°¡åãªäŸãèããŠã¿ãŸãããã補åãäºçŽãããµãŒãã¹ã§ãã ã³ã³ãããŒã©ãŒã¯ã補åã®ã³ã¬ã¯ã·ã§ã³ãREST APIã«éä¿¡ããããŒã¿ãè¿ããã³ã³ãããŒã©ãŒã§ãšã©ãŒãçºçãããµãŒãã¹ã䜿çšããŸãã
åçã«ProductControllerã®ãªã¹ãã衚瀺ãããŸãã äºçŽæ¹åŒã§ã¯ãCookieãããããã¡ã€ã«ãååŸããŸãããŸããããŒãã¹ãã€ã³ããIDãããã³ãã®ä»ã®æçšãªæ å ±ãä¿åãããŠããå ±é ¬ã¢ã«ãŠã³ãããCookieããååŸããŸãã ãããŠããã®cookieãæ¬ èœããŠããŸã-æªå®çŸ©ã idãå ±é ¬ããååŸãããå Žåããšã©ãŒãçºçããŸãã ããŒã«ã«ã§ã¯ããã¬ãŒã¯ãã€ã³ãïŒèµ€ãç¹ïŒãèšå®ãããã¹ãŠã®ãªããžã§ã¯ãã®ã¹ããŒã¿ã¹ãååŸããã³ãŒããã¯ã©ãã·ã¥ããçç±ãèŠã€ããŸãã
å éšã§ã©ã®ããã«æ©èœãããã瀺ããŸãã®ã§ãã¹ã¿ãã¯ãã¬ãŒã¹ãšã¯äœããç解ã§ããŸãã ïŒ DebugTraceïŒïŒã³ãã³ãããã€ãã£ãV8ã³ãã³ããèšè¿°ããNode.jsã--allow-natives-syntaxãªãã·ã§ã³ã§å®è¡ãããã€ãŸãV8ã§ãã€ãã£ãæ§æãæå¹ã«ãããšãã¹ã¿ãã¯ãã¬ãŒã¹ã§å€§ããªã¡ãã»ãŒãžã衚瀺ãããŸãã
2çªç®ã®ãã¬ãŒã ã®æäžéšã«ã¯ãã³ã³ãããŒã©ãŒã¡ãœããã®åã«äºçŽé¢æ°ããããProductControllerã³ã³ããã¹ããžã®ãªã³ã¯ã衚瀺ãããŸã-ãããèŠæ±ããã³å¿çãã©ã¡ãŒã¿ãŒãããŒã«ã«å€æ°ãååŸãããã®äžéšã¯ã¹ã¿ãã¯ã«æ ŒçŽããããã1ã€ã¯ããŒãïŒç®¡çããŒãïŒ ïŒ ãŸãããœãŒã¹ã³ãŒãããããŸãããªããžã§ã¯ãã®ç¶æ ãååŸããããã«ãããã°ããå Žåã¯ãéçšç°å¢ã§ãã®ãããªãã®ãçšæããŠãããšããã§ãããã
ãã®ãããªãµããŒãã¯ã2015幎ã«ããŒãžã§ã³0.12ããå®è£ ãããŸããã Nodeã--abort-on-uncaught-exceptionãã©ã°ãæå®ããŠå®è¡ãããšãã³ã¢ãã³ããäœæãããŸããããã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãšããŒããã³ããå«ãããã»ã¹å šäœã®ã¡ã¢ãªã¹ãããã·ã§ããã§ãã
å¿ããŠããŸã£ãæ¹ã®ããã«ãæãåºãããŠãã ãããã¡ã¢ãªã¯æ¡ä»¶ä»ãã§åŒã³åºãã¹ã¿ãã¯ãšããŒãã§æ§æãããŠããŸãã
ã³ãŒã«ã¹ã¿ãã¯ã§ã¯ãé»è²ã®ã¬ã³ã¬ããã¬ãŒã ã§ãã ãããã«ã¯é¢æ°ãå«ãŸããé¢æ°ã«ã¯å ¥åãã©ã¡ãŒã¿ãŒãããŒã«ã«å€æ°ãããã³æ»ãã¢ãã¬ã¹ãå«ãŸããŸãã ãããŠãå°æŽæ°ïŒSMIïŒãé€ããã¹ãŠã®ãªããžã§ã¯ãã¯ãã¢ãã¬ã¹ããããããŒãžããŒãã«æ ŒçŽãããŸãã
ã³ã¢ãã³ãã®æ§æãææ¡ããŸããã次ã«ãäœæã®ããã»ã¹ã«é²ã¿ãŸãããã
ããã§ã¯ãã¹ãŠãç°¡åã§ããã¢ããªã±ãŒã·ã§ã³ããã»ã¹ãå®è¡ããããšã©ãŒãçºçããããã»ã¹ãã¯ã©ãã·ã¥ããã³ã¢ãã³ããäœæãããŠãããã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŸãã 次ã«ãå®çšŒåç°å¢ã«ãªã¢ãŒãæ¥ç¶ãããããã®ã³ã¢ãã³ããããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã«ãã«ãããããã¬ãŒã§ãããã°ããä¿®æ£ããã°ã©ã ãäœæããŠå ¬éããŸãã ãã®ããã»ã¹ãã©ã®ããã«èŠããããç解ããã®ã§ã䜿çšã§ãããããã¬ãŒãèŠã€ããå¿ èŠããããŸãã
ãããã¯ãã¹ãŠNode.jsã®åã«çŸããŸããã JS Stack Traceãèªã¿åãããã«ãããŸããŸãªæç¹ã§ããã€ãã®ãã©ã°ã€ã³ãäœæãããŸããã ãããã®ã»ãšãã©ã¯ãã§ã«å€ããªã£ãŠãããNode.jsã®ææ°ããŒãžã§ã³ã§ã¯ãµããŒããããŠããŸããã ã»ãšãã©ãã¹ãŠãè©ŠããŸãããããã®ã¬ããŒãã§ã¯llnodeã匷調ããŸãã ã¯ãã¹ãã©ãããã©ãŒã ïŒWindowsãé€ãïŒã§ã4çªç®ä»¥éã®Node.jsã®ææ°ããŒãžã§ã³ã§åäœããŸãã ãã®ãããã¬ã䜿çšããŠçç£ãšã©ãŒããããã°ããæ¹æ³ã瀺ããŸãã
äžèšã®äŸ-補åäºçŽãæ€èšããŠãã ããã
ç°å¢ãèšå®ããã³ã¢ãã³ããäœæããæ©èœãèšå®ãããã©ã°--abort-on-uncaught-exceptionãæå®ããŠNodeã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã 次ã«ãããã»ã¹pidãååŸããCookieã®å ±é ¬ãæããªããŠãŒã¶ãŒã«ãªã¯ãšã¹ããè¡ããreserveã¡ãœããã®ProductControllerã«ãšã©ãŒã衚瀺ãããããšã瀺ãã¡ãã»ãŒãžãååŸããŸãã
次ã«ãã³ã¢ãã³ããäœæããããšããã¡ãã»ãŒãž-ã¡ã¢ãªã®ãã£ã¹ããååŸããŸãã ã³ã¢ãã³ããŸãã¯ããã«ã¢ã¯ã»ã¹ããåŸãå¯çšæ§ã確èªããŸã-éãã¯1.3 GBã§ãã ããããã
llnodeã³ãã³ãã䜿çšããŠãããã¬ãŒã§ãã®ã³ã¢ãã³ããå®è¡ãããšãbtã³ãã³ãã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ãååŸã§ããŸãã
ãã®ç»åã¯ããã¬ãŒã 4ã20ã«æ å ±ããªãããšã瀺ããŠããŸãïŒäžäžã«è©³çŽ°ã«è¡šç€ºïŒã
å®éã®ãšãããããã¯JSã¹ã¿ãã¯ãã¬ãŒã¹ã§ãããC ++ãããã¬ãŒã¯èªã¿åãããšãã§ããŸããã ãããèªãã«ã¯ããã©ã°ã€ã³ã䜿çšããã ãã§ãã
V8 btã³ãã³ããå®è¡ãããšãJS Stack TraceãååŸãããŸãã6çªç®ã®ãã¬ãŒã ã«ã¯äºçŽæ©èœããããŸãã ãã¬ãŒã ã«ã¯ããã®ProductControllerã®ã³ã³ããã¹ããžã®ãªã³ã¯ããã©ã¡ãŒã¿ãŒïŒIncomingMessage-RequestãServerResponseãå«ãŸããã¡ã¢ãªå ã®é¢æ°ã®ã¢ãã¬ã¹ã¯éã§åŒ·èª¿è¡šç€ºãããŠããŸãã ãã®ã¢ãã¬ã¹ã§ã¯ãã³ã¢ãã³ããããœãŒã¹ã³ãŒããååŸã§ããŸãã
次ã«ãv8 inspect --print-source [address]ã³ãã³ããèšè¿°ããã¡ã¢ãªããé¢æ°ã®ãœãŒã¹ã³ãŒããååŸããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã«æ»ã£ãŠããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ãã©ã¡ãŒã¿ãããããªã¯ãšã¹ãã®å 容ã確èªããŸãããã
ç»åã§ã¯ãã¢ãã¬ã¹ãæå®ããv8 inspectã³ãã³ãã衚瀺ãããŠããŸãã å®è¡åŸããªã¯ãšã¹ããªããžã§ã¯ãã®ç¶æ ãåãåããŸãã ããã§ã¯ãããããã£CookieãURLãPOSTã¡ãœãããããã³æ¬æã«é¢å¿ããããŸãã ãµãŒããŒã«è»¢éããã補åã確èªããŸãã
ã³ãã³ãv8 inspect [body address]ãæžããŸãããã
productsããããã£ã®3ã€ã®èŠçŽ ã§é åãæ§æãããŠãããªããžã§ã¯ããååŸããŸãã ãã®ã¢ãã¬ã¹ãååŸããŠæ€æ»ããidããé åãååŸããŸãã
ããã§åé¡ã¯ãããŸããã req.cookiesãªããžã§ã¯ãã®å 容ãèŠãŠã¿ãŸãããã
ããã¯ããããã¡ã€ã«ãšå ±é ¬-æªå®çŸ©ã®2ã€ã®ããããã£ã®ãªããžã§ã¯ãã§ãã å ±é ¬ã¢ã«ãŠã³ããæã£ãŠããªããŠãŒã¶ãŒãèŠã€ããŸãã
ã³ãã³ãv8 inspect [address profile]ãäœæããŠããã®IDãšstoreidãååŸããŸãããã ãããã£ãŠããœãŒã¹ã³ãŒããååŸããã«ãŠãŒã¶ãŒã»ãã·ã§ã³ã埩å ããããã«ããœãŒã¹ã³ãŒãã䜿çšããã«æ¬çªç°å¢ã§äœæ¥ããããšãã§ããŸããã
ããã¯éåžžã«äŸ¿å©ãªã±ãŒã¹ã§ãErrorHandlerããã«ãŠã§ã¢ãå«ããã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåãã¹ã¿ãã¯ãã¬ãŒã¹ããã³ã³ããã¹ãthisãrequestãresponseãžã®ãªã³ã¯ãããåã®äŸãšã¯ç°ãªããErrorHandlerãæžãæããªãå Žåã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ã«ã¯ãExpressèªäœããã®ææ°ã®åŒã³åºããå«ãŸããäœãæ©èœããŸããã ãªã³ã¯ã¯ãããŸããã
ãããã©ã®ããã«èµ·ãããäŸã瀺ããŸãã
reserveã¡ãœããã䜿çšããåãäŸã§ãããéåæã¢ãŒãã§åäœãããµãŒãã¹ã§ãã§ã«ãšã©ãŒãçºçããŠããŸãã ããããã£ããããããã«ãunhadledRejectionããã»ã¹ã®ã€ãã³ãããµãã¹ã¯ã©ã€ãããprocess.abortïŒïŒãå®è¡ããŠã³ã¢ãã³ããäœæããŸãã
以äžã¯ããã®å Žåã®ããã¯ãã¬ãŒã¹ã®æ§åã瀺ããŠããŸãã
ProductControllerã«é¢ããæ å ±ãäºçŽã«é¢ããæ å ±ã¯ãããŸããã ãã®ãã¬ãŒã ã«ã¯process.onã®åŒã³åºãããããä»ã«ã¯äœã圹ã«ç«ã¡ãŸããã ãã®ãããªã±ãŒã¹ã¯ããšã©ãŒããã£ããããããã¹ã¿ãã¯ãã¬ãŒã¹ã«æ å ±ããªããšãã«ãæ¬çªç°å¢ã§çºçããŸãã ããã«ãã¹ã¿ãã¯ãã¬ãŒã¹ãªãã§ãããŒãžããŒãã®ã¿ã䜿çšããŠããã¹ãŠã®ãªããžã§ã¯ããèŠã€ããæ¹æ³ã瀺ããŸãã
ã¿ã€ãIncomingMessageã«ãã£ãŠãªããžã§ã¯ãã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãã ããã¯éä¿¡ããããã¹ãŠã®ãªã¯ãšã¹ãã®å€§ããªãªã¹ãã«ãªããŸãããããã»ã¹ãã¯ã©ãã·ã¥ããããã®ãèŠã€ããå¿ èŠããããŸãã
ãã®å Žåããã°ãå¿ èŠã§ããããã®äžã«id request'aãååŸããå¿ èŠããããŸã-ããã¯X-Transaction-IDã§ãã
llnodeã§ã¯ãã¡ã¢ãªå ã§æååã®å€ã«ãã£ãŠããããåç §ãããªã³ã¯ãèŠã€ããããšãã§ããŸãã ã³ãã³ãv8 findrefs --string [string value]ãäœæãããšãX-Transaction-IDããããã£ãæã€ãªããžã§ã¯ããèŠã€ããããã®æååãåç §ããŸãã ãã®ãªããžã§ã¯ããäœã§ãããã調ã¹ãŠãã ããã
v8 inspect [address]ã³ãã³ããèšè¿°ããåŸãããããŒãªããžã§ã¯ããååŸããŸãã 次ã«ããã®ãªããžã§ã¯ããåç §ãããã®ãèŠã€ããIncommingMessageãªããžã§ã¯ããååŸããŸãã ãããã£ãŠãã¹ã¿ãã¯ãã¬ãŒã¹ãšã¢ãã¬ã¹ããªããŠãããŠãŒã¶ãŒã»ãã·ã§ã³ã埩å ã§ããŸããã
ããŒã«ã«å€æ°ãååŸããå¿ èŠãããå Žåãããè€éãªäŸã調ã¹ãŠã¿ãŸããã-ãããã¯ãµãŒãã¹å ã«ãããŸãã ãšã©ãŒãã©ããã«æ·±ãèœã¡ãŠãããããŒã¿ãã»ãšãã©ãªããšä»®å®ããŸãã ãã®å ŽåãREST APIã䜿çšãããŸãã ãªããžã§ã¯ãã¯ããŒã¿ããŒã¹ããååŸããããããã¯ãã¹ãŠsomeLocalValueãšåŒã°ããããŒã«ã«å€æ°ã«å²ãåœãŠãããŸãã ãããŠãsomeLocalValueãåç §ãããªããžã§ã¯ãã¯ãããŸããã ã¡ã¢ãªããããŒã«ã«å€æ°ãååŸããæ¹æ³ã¯ïŒ ãã°ããååŸããå Žåãããšãã°idå€ã§ãã®ãªããžã§ã¯ããèŠã€ããããšãã§ããŸãããããããã£ã®ååã§ã¡ã¢ãªãããªããžã§ã¯ããååŸããããšãã§ããŸãã v8 findrefs nameã³ãã³ãã䜿çšãããšãuserAccountãpreferredStoreããããã£ãæã€ãªããžã§ã¯ããæ€çŽ¢ã§ãããããå¿ èŠãªããŒã«ã«å€æ°ãååŸã§ããŸãã
ããã§ã¯ãå®éã®ã±ãŒã¹ãåãäžããŸããã-æ¬çªç°å¢ã§ã®ãšã©ãŒã§ãã
ãšã©ãŒããšã«ãã³ã¢ãã³ããäœæããŸãã ããããããã§äœãåé¡ãªã®ã§ããããïŒ å€ãã®ãšã©ãŒããããŸã-1åããã3620ãã³ã¢ãã³ãã®ééã¯1.3 GBã§ãã·ã¹ãã ã«äœæããŠããŒãžããã®ã«ãããæéã¯çŽ15ã20ç§ã§ãã ã³ã¢ãã³ãäœæãéžæããããã®ããžãã¯ãæããã«äžååã§ãã
ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠãããšãã«ãšã©ãŒãçºçããå ŽåããåçŸãé£ãããšã©ãŒããã£ããããå Žåã§ãã 次ã«ãããã»ã¹ã¯ErrorHandlerã«å ¥ããŸããããã§ãããžãã¯ããããŸã-ãã®ãšã©ãŒã«å¯ŸããŠprocess.abortãå®è¡ããŠã³ã¢ãã³ããäœæããå¿ èŠãããã®ãââããããšãããã°ã©ã ã®å®è¡ãç¶ç¶ããã®ãã
ãšã©ãŒãäžæã§ãããåŠçããå¿ èŠãããå Žåãnode-reportã䜿çšããŠã¬ããŒããçæãããprocess.abortãåŒã³åºãããŠã³ã¢ãã³ããäœæãããããã»ã¹ãåèµ·åãããŸãã ãµãŒããŒã¯åã³åäœãããã©ãã£ãã¯ãåŠçããŸãããã®åŸãã¬ããŒããã³ã¢ãã³ãããã°ã«ã¢ã¯ã»ã¹ãããããã¬ã䜿çšããŠãããã°ããä¿®æ£ããã°ã©ã ãäœæããŠå ¬éããŸãã
以äžã®ç»åã¯ãéžæãè¡ãããžãã¯ã®äŸã瀺ããŠããŸãã ç§ã¯ããããšã©ãŒã®ã¬ãžã¹ããªãšåŒã³ãŸãã ã³ã¢ãã³ãã®äœæãå¶éããŸãã
ããã¯In-Memory Databasesã䜿çšããã¯ã©ã¹ã§ããããšã©ãŒãèŠã€ãã£ãå Žåã¯ãã¬ãžã¹ããªã«ç»é²ãããŠãããã©ããã確èªããŸãã ããã§ãªãå Žåã¯ãç»é²ããå¿ èŠããããã©ããã確èªããŸãã ãã®å Žåãããã»ã¹ããªã»ããããã³ã¢ãã³ããäœæããŸãã ãã®å Žåãç¹°ãè¿ããããšã©ãŒã®ã³ã¢ãã³ãã¯äœæããŸããã ããããéžæããŸãã ããã«ããããããã°ããã»ã¹ãé«éåãããŸãã
å®çšŒåç°å¢ã§ã®ãããã°ããã»ã¹ã¯ãããŒãã¬ããŒãã§äœãèµ·ãã£ãã®ããã©ãã§ãã©ã®ãããªç¶æ³ã§JSã¹ã¿ãã¯ãã¬ãŒã¹ããã»ã¹ã«å¯ŸããŠç¯ãããã®ãã瀺ããããçš®ã®æ¢åµèª¿æ»ã ãšæããŸãã ãã°ã¯ããªãŒãã蚌æ ã貎éãªæ å ±ãæäŸããŸãã ãããã¬ãŒã䜿çšãããšãç¯çœªæãã€ãŸããããã®é¢æ°ã§çºçãããªããžã§ã¯ããèŠã€ããããšãã§ããŸãã
ããããæ¬çªããã³ãããã°ãšã©ãŒã§ã®äœæ¥æ¹æ³ã§ãã
ã¡ã¢ãªãªãŒã¯ãæ€çŽ¢ãã
ã¡ã¢ãªãªãŒã¯ã®æ€åºã«é²ã¿ãŸãããã
ã¡ã¢ãªãªãŒã¯ãæ€åºããã«ã¯å€ãã®æ¹æ³ããããŸãïŒäžèšã®ç»åã§èª¬æãããŠãããã®ããããŸãïŒã
ããšãã°ãããã»ããµã®è² è·ãšã¡ã¢ãªã®ã°ã©ãã§ã¯ãç¹å®ã®çžé¢é¢ä¿ã確èªã§ããŸãã ãŸããã¡ã¢ãªãªãŒã¯ãçºçããç¶æ³ã§ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãèªã¿èŸŒãŸãããããããå€ãã®ããã»ããµæéãããããŸãã
ãªãŒã¯ã®äŸãèããŠã¿ãŸãããã
äžã®ç»åã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ã¹ã±ãžã¥ãŒã«ã瀺ããŠããŸãã Scavenge-è¥ããªããžã§ã¯ãã®ç©ºéã§åäœããŸãã MarkSweep-å€ããªããžã§ã¯ãã®ã¹ããŒã¹ã ã°ã©ãã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æ°ãå¢å ããŠããããšã瀺ããŠããŸããã€ãŸããã¡ã¢ãªããªãŒã¯ããŠãããããé »ç¹ã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå¿ èŠã«ãªã£ãŠããŸãã ã©ãã§ãã©ã®ã¹ããŒã¹ã§æŒããŠããããç解ããããã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã®ãŽãã䜿çšããŸãã
äžã®ç»åã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åå埩ã§ã®ã¹ããŒã¿ã¹ã衚瀺ããã¡ã¢ãªé åã®ãªã¹ãã瀺ããŠããŸãã å€ãã¹ããŒã¹ãæ°ããã¹ããŒã¹ãªã©ããããŸãã ã³ã¢ãã³ããããœãŒã¹ã³ãŒããåãåã£ããšããã³ãŒãã¹ããŒã¹ããååŸããŸããã
çµéšãããã¡ã¢ãªãæ°ãããªããžã§ã¯ãã®ã¹ããŒã¹ã«ãªãŒã¯ããå Žåãé«äŸ¡ãªã¯ããŒã³äœæãããŒãžãªã©ãåå ã§ãããšèšããŸãã å€ããªããžã§ã¯ãã®å€§ããªã¹ããŒã¹ã«ã¡ã¢ãªãæµããå Žåããããã¯èŠéãããã¯ããŒãžã£ãŒãã¿ã€ããŒã§ãã ãŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒãæ©èœããªã倧ããªã¹ããŒã¹ã§ã¡ã¢ãªãªãŒã¯ãçºçããå Žåãããã¯å€§ããªJSONã®ã·ãªã¢ã«å/éã·ãªã¢ã«åã§ãã
以äžã®ç»åã¯ãè¥ããªããžã§ã¯ãã®é åã§æ©èœããã¹ã«ãã³ãžãã¬ãŒã¹ã®äŸã瀺ããŠããŸãã ã¡ã¢ãªãªãŒã¯ã¯ãããŸããã
ã©ããã£ãŠãããèŠã€ããããšãã§ããŸããïŒ å€ªåã®ç·ã®åã2ã€ãããŸãã ã¢ã»ã³ããªã®åãšåŸã®ããã»ã¹ã«å²ãåœãŠããããã®ã¡ã¢ãªã å€ã¯çãããããã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åŸãå²ãåœãŠãããã¡ã¢ãªãå¢å ããªãã£ãããšã瀺åããŠããŸãã éããã©ã³ãã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«è²»ããããæéã瀺ããŸãã ããã¥ã¡ã³ãã«ã¯ãããã©ã«ãã§1ããªç§ããããšèšèŒãããŠããŸãã ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãããã¯çŽ3ç§ã§ããããããæšæºãšèããŠããŸãã äžã®äžéšã®ç»åã«ã¯3è¡ã衚瀺ãããŠããŸããããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§ãããå埩çã§ããã€ãŸããã¡ã¢ãªã®ãã¹ãŠãã¹ãã£ã³ãããŠæ¶å»ãããããã§ã¯ãªããæççã«è¡šç€ºãããŸãã ãŸããå埩åæ°ã衚瀺ãããŸãã
以äžã®ç»åã¯ãåãã¹ããŒã¹ã§ã®ã¡ã¢ãªãªãŒã¯ã®äŸã瀺ããŠããŸãã ã©ã€ã©ãã¯ã®åã¯ãå æã¡ã¢ãªã®éãå¢å ããŠããããšã瀺ããŠããŸããã€ãŸããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åŸãæ¯åå¢å ããŠããŸãã
å€ããªããžã§ã¯ãã®ç©ºéã¯ã©ãã§ããïŒ
ããã§ã¯ãããã»ã¹ã«æéããããããšãããããŸãïŒ90msã110msãªã©ã ããã¯ãããããããŸãã ããã«ãããã¯ãŸã å埩çã§ãããããã¯ã°ã©ãŠã³ãã¹ã¬ããã§ãæéãããããŸãã
å éšã§ã¯ãNode.jsã«ã¯ããã€ãã®ã¹ã¬ããããããŸãã 1ã€ã¯ãããã¡ã€ãªã³ã°çšãè€æ°ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³çšããããŠã¢ããªã±ãŒã·ã§ã³èªäœãå®è¡ããããã®ã¹ã¬ããã§ãã
ã¡ã¢ãªãªãŒã¯ãæ€åºããæ¹æ³ãç解ããã«ã¯ã以äžã®äŸãæ€èšããŠãã ããã
ãªã¯ãšã¹ããåŠçããããã«ãŠã§ã¢ã¯ãæåã«å®è¡ã®éå§æéãååŸãããªã¯ãšã¹ããçµäºãããšãå®è¡åŸã®æéãä¿®æ£ããŸããããã¯ãåŠçããäœããã®é¢æ°ãåŒã³åºããã-someProcessOperationã§ãã ãã®é¢æ°ã«ãªã¯ãšã¹ããæž¡ããŸãã ééããããŸãã èŠæ±ãªããžã§ã¯ãã¯ãéä¿¡åŸã«ä¿æãããŸããã ããã«ãä»ã®ãªã³ã¯ããŸã ããå¯èœæ§ããããå€ãã®ãªããžã§ã¯ãããã«ããŸãã ãã®å Žåãäœããã¹ãã§ããïŒ èŠæ±ãªããžã§ã¯ãå šäœã¯å¿ èŠãããŸããã idãšurlã®ã¿ãæž¡ãããšãã§ããŸãã ããã«ãããã¡ã¢ãªãªãŒã¯ãåé¿ã§ããŸãã
ã©ãããã°ããããŸããïŒ
llnodeãããã¬ãŒã§ãããè¡ãæ¹æ³ã瀺ããŸãïŒFatallãšã©ãŒã®å Žåãã¡ã¢ãªäžè¶³ã®ããã«ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããåŸã«Node.jsãã³ã¢ãã³ããäœæãããšãïŒã åã®ã±ãŒã¹ã§ã¯ãäŸå€ãèœã¡ãŠããã»ã¹ãçµäºãããšãã«ã³ã¢ãã³ããçºçããŸããã ä»åã¯ããã¡ãããå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã§process.abortïŒïŒãåŒã³åºããŠã³ã¢ãã³ããååŸããŸããã§ããããã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ãã«ã§ããã»ã¹IDãç §äŒããå¿ èŠã«å¿ããŠã³ã¢ãã³ããååŸã§ããgcoreããŒã«ãçšæããŸããã ãã ããããã§ã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å¶çŽã«çŽé¢ããŠãããããä»ã®ãªãã·ã§ã³ãæ¢ãå¿ èŠããããŸããã
1ãæåãgen-coreãšããã©ã€ãã©ãªãå ¬éãããŸããã ãã®ããŒã«ã䜿çšãããšãããã»ã¹ããã©ãŒã¯ããã¡ã€ã³ããã»ã¹ã«æªåœ±é¿ãäžããããšãªãããã»ã¹ãçµäºããã³ã¢ãã³ããååŸã§ããŸãã
以äžã®ç»åã¯ãgen-coreã®ä»çµã¿ã®äŸã瀺ããŠããŸãã
ããã§ãREST APIã«ããDiagnosticControllerã¯ã³ã¢ãã³ããå®è¡ã§ããŸãã
llnodeã䜿çšããŠã¡ã¢ãªãªãŒã¯ãæ€çŽ¢ããæ¹æ³
findjsobjectsã³ãã³ãããããŸããããã䜿çšããŠãããŒãå šäœãã¹ãã£ã³ããã¿ã€ãããšã«ã°ã«ãŒãåããåã¿ã€ãã®ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®æ°ãã¡ã¢ãªå ã®ãµã€ãºãªã©ã®ã¬ããŒããååŸã§ããŸãã äžã®ç»åã¯ãServerResponseãšIncomingMessageã®ã€ã³ã¹ã¿ã³ã¹ãå€æ°ããããšã瀺ããŠããŸããTimeoutãªããžã§ã¯ããšStringãªããžã§ã¯ãããããŸãã æååèªäœã¯éåžžã«å€§ãããå€ãã®ã¡ã¢ãªãå æããŸãã å€ãã®å Žåãã¬ããŒãžã³ã¬ã¯ã¿ãŒãæ©èœããªã倧ããªã¹ããŒã¹ã«ãããŸãã
ãªããªã¯ãšã¹ããªããžã§ã¯ããããããããã®ããèŠãŠã¿ãŸãããã èŠæ±ãªããžã§ã¯ãã¯ããã«ãŠã§ã¢ã«ä¿æãããŠããããšãæãåºããŠãã ããã
findjsinstances [type]ã³ãã³ãããããããã䜿çšããŠãªã¯ãšã¹ããªããžã§ã¯ãã®ãªã¹ããååŸããŸãã
æåã®ãªããžã§ã¯ãã®ã¢ãã¬ã¹ãååŸããv8 findrefs -vã³ãã³ãã䜿çšããŠãã¡ã¢ãªã«ãªã³ã¯ããããªããžã§ã¯ããæ¢ããŸãã
ãããã¯2ã€ã®ãªããžã§ã¯ãã§ãã æåã¯18èŠçŽ ã®é åã§ã2çªç®ã¯ãªã¯ãšã¹ããªããžã§ã¯ãã§ãã ãã®é åãäœã§ãããããããŠããããªã¯ãšã¹ããªããžã§ã¯ããä¿æããçç±ãèŠã€ããŸãã
v8 findrefs -v [ãã®é åã®ã¢ãã¬ã¹]ã³ãã³ãã䜿çšãããšããã®é åãProfilleråã®ãªããžã§ã¯ããšprocessingQueueããããã£ã«ããããšãããããŸãã ãããã£ãŠããªã¯ãšã¹ããªããžã§ã¯ããã¡ã¢ãªã®ã©ãã«ä¿æãããŠããããç¥ãããšãã§ããŸããã 次ã«ããœãŒã¹ã³ãŒãã«ç§»åããããããããååŸããŠprocessingQueueãåŒã³åºãããå Žæã確èªããŸãã
findjsinstancesã³ãã³ã[ã¿ã€ãã¿ã€ã ã¢ãŠã]ã䜿çšããŠããã¹ãŠã®ã¿ã€ã ã¢ãŠãã®ãªã¹ããååŸãããããã䜿çšãããŠããå Žæãæ¢ããŸãã
v8 iã³ãã³ãã䜿çšãããšãæåã®ã¿ã€ã ã¢ãŠããçºçããŸãã
onTimeoutããããã£ã§ã¯ãsetIntervalé¢æ°ãåŒã³åºããããã¡ã€ã«ã®å Žæãå«ãã¢ãã¬ã¹ã衚瀺ãããŸãã ãããã£ãŠãå¿ããããã¿ã€ããŒãã©ãã«ããã®ãããªãå®è¡ãããŠããã®ããããã«èŠã€ããŸããã
ã¢ããªã±ãŒã·ã§ã³ã®èšèšæ®µéã§ã¡ã¢ãªãªãŒã¯ãèå¥ããæ¹æ³
V8ã§æè¿è¿œå ãããïŒ DebugTrackRetainingPathïŒxïŒã³ãã³ãïŒNode.jsã¯ãŸã ãµããŒãããŠããŸãïŒã䜿çšããV8ãœãŒã¹ãããŠã³ããŒãããV8ãããã¬ãŒããã«ãããŠäœ¿çšããäžèšã®JSã€ã¡ãŒãžãå®è¡ãããšãå¿ èŠãªãªã³ã¯ãååŸãããŸãã«ãŒããªããžã§ã¯ããŸã§ã®å€æ°ã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®åŒã³åºããå¿ããªãã§ãã ããã äŸã§ã¯ãããã¯gcïŒïŒã®åŒã³åºãã§ãã
ãã©ã°--allow-natives-syntaxã-track-retaining-pathã-expose-gcãããã³ãã¡ã€ã«test.jsãæå®ããŠdebug8ãå®è¡ããŸãã ãªã¹ãã§ã¯ããªããžã§ã¯ããã«ãŒãã«ä¿æããŠãããŠãŒã¶ãŒãšå¯Ÿè±¡ã段éçã«ååŸããŸãã
ãã®ãããå®çšŒåç°å¢ã§ã®ã¡ã¢ãªãªãŒã¯ã®æ€çŽ¢ãæ€èšããŸããã
ã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°
äžã®ç»åã§ã¯ã次ã®ãªãªãŒã¹åŸã«ããã©ãŒãã³ã¹ã5åäœäžããå®éã®äŸãèŠãããšãã§ããŸãã Web UIã¢ããªã±ãŒã·ã§ã³ã®ããŒãæéãåçã«å¢å ããŸããã
ãã®ãããªå Žåã«ã¯ãã¢ã¯ã·ã§ã³ã®ã·ã³ãã«ã§å¹æçãªã¢ã«ãŽãªãºã ããããŸããããã以äžã«ç€ºããŸãã
2013幎ã«Node.jsã«ãããã¡ã€ã©ãŒãè¿œå ãããŸããããæšå¹Žã¯tick-processorïŒV8ã®ãã°ãšã¬ããŒããåŠçããããŒã«ïŒã®ã¿ãç»å ŽããŸããã ãã®åã«ããã£ãã¯ããã»ããµãåããV8ãããã¡ã€ã©ã䜿çšããããV8èªäœãããŠã³ããŒãããŠãã«ãããããã§ããŒã«ã§ããã»ããµãã¢ã¯ãã£ãåããå¿ èŠããããŸããã
ãããã¡ã€ã©ãŒã¯é«ã¬ãã«ã®æ å ±ãæäŸããåé¡ã®æ§è³ªãå€æããã©ã®æ©èœãæãé·ãå®è¡ããããã確èªããã®ã«åœ¹ç«ã¡ãŸãã
ãã®ãã°ã®ããŒã¿ã¯ã°ã©ãã£ã«ã«åœ¢åŒã§äŸ¿å©ã«è¡šç€ºããããã¬ãŒã ã°ã©ããšåŒã°ããŸãã 2013幎ã«ãã¬ã³ãã³ã°ã¬ãã°ã«ãã£ãŠéçºãããŸããã
2015幎ã«ã°ã©ããååŸããããšã¯æ¬åœã«é çã®çš®ã§ããããçŸåšã¯0xã䜿çšããŠ1ã€ã®ããŒã ã«ãã£ãŠäœæãããŠããŸãã
次ã«ããããã©ã®ããã«äœ¿çšããããèããŠã¿ãŸãããã
ã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ã«ã匷調ããã«ã¯ãäžã®ãã¿ã³ã§äžèŠãªãã®ããã¹ãŠåé€ããŸãã ãã®çµæãã¢ããªã±ãŒã·ã§ã³ã¯ç·å®è¡æéã®ã»ãã®äžéšããå ããªãããšãããããŸãã
é¢æ°åŒã³åºãã·ãŒã±ã³ã¹ã®ã¹ã¿ãã¯ãã¬ãŒã¹ã¯æéã§ãããç»é¢ã«åãŸããŸãã ãã®åŸãäœãé·ãæéãããããŸããïŒ npmããã±ãŒãžã®åŒ·èª¿è¡šç€ºããªã³ã«ãããšãã¢ããªã±ãŒã·ã§ã³èªäœããã9åé·ãå®è¡ãããããšãããããŸãã ããã¯ãããããããŸãã
æé©åãããé¢æ°ã匷調ãããšããããã®é¢æ°ãéåžžã«å°ãªãããšãããããŸãã åŒã³åºãã®çŽ90ïŒ ã¯æé©åãããŠããŸããã
åŒã³åºãã®äžéšãèŠããšãã¢ããªã±ãŒã·ã§ã³ã§ã¯å€ãã®ã¹ã¿ãã¯ããã³ãã«ããŒã«ãã£ãããšãããããŸããããã«ãããŒãžãªããžã§ã¯ããäœæããlodashããŒãžãããããµãŒãããŒãã£ã®ãŠãŒãã£ãªãã£ãæéãããããŸããã
, , , . . â .
?
- CPU : merge, JSON, string parse
- view templates
- npm-
- Node.js ( V8 optimization killers) â
, .
, handlebars helpers. view , â . , . , ,- .
, , . . 3,5 , .
, ( JSON) , . , .
ãããã«
-
-
- staging/pre-production environments
-
, . , HolyJS 2018 Piter , Main Thread Node.js . JS, :
- RxJS: ( , Exadel)
- New adventures in frontend, Season 2 ( , Smashing Magazine)
- ãã©ãŠã¶ã®ãã€ã¯ãªããïŒWebWorkersãGPUãWebAssemblyãããã³ãã®ä»ã®åªããæ©èœ ïŒDenis RadinãEvolution GamingïŒ
- JS Chrome DevTools ( , Google)