åå¿è äºäººã§ISUCONäºé¸ã«çªæãã¦äºæ³éãææ²ããã
çµå±ISUCONã®äºé¸ã¯æ¨æã®çµæã ã£ãããã§ããã彿¥ã®æµããæ¸ãèµ·ããã¦ããããã¨æãã¾ãã
ISUCONã¨ã¯Iikanjini Speed Up Contestã®ç¥ã§ã
ãé¡ã¨ãªãWebãµã¼ãã¹ã決ããããã¬ã®ã¥ã¬ã¼ã·ã§ã³ã®ä¸ã§éçã¾ã§é«éåãå³ããã¥ã¼ãã³ã°ããã«
ã§ãã
æè¿å人ï¼@__shiki49__ï¼ãYAPC::Asia 2014ã«è¡ã£ãéã«ãã®åå¨ãç¥ã£ããããã
ããããªã³ã³ãã¹ãããããï¼ãã¨ãããã¨ã§ç´¹ä»ãã¦ããã¾ããã
ãµã¼ãã¯ã¡ãã£ã¨ç«ã¡ä¸ããäºããããããã§ã»ã¨ãã©å¤§ããç¥èããªãã
ã¾ãã¦ããã¥ã¼ãã³ã°ãªãã¦åºæ¥ã訳ç¡ããªã©ã¨æåã¯æã£ãã®ã§ããã
ããããæ©ä¼ã大åã«ãããããä½äºããã£ã¬ã³ã¸ã大äºããªã¨æãã
åå¿è
äºäººã§äºé¸ã«åå ããäºã«ãã¾ããã
æºåãããã¨
æ¹é
ã¾ãWebã¢ããªã®è¨èªã«ã¤ãã¦æ±ºãã¾ããã
åäººãæ®æ®µæ±ãè¨èªã¯PHPã§åã¯Pythonã ã£ãã®ã§ããã
ãäºé¸ã®çªç ´ã大äºã ãã©ããã£ã±ãåå¼·ã®ããã¨ããã¢ããã¼ã·ã§ã³ã大äºã«ãããããã
ã©ãããªãæ°ããè¨èªã§ãããï¼ãã¨ãããã¨ã§Node.jsã«æ±ºå®ãã¾ããã
æ å ±åé
äºåã«è²ã ãªå 人éã®ããã°ãèªãã§ã¿ã¾ããã
- æåã«ãµã¼ãã¹å ¨ä½ãææ¡ããäºã大äºããã ã
- ããã«ããã¯ãèªèããã®ãéµã¨ãªãããã
- ä¸ä½ã©ããã£ã¦ããã®ï¼åãªã®ããã»ãªãªã¼ãããã®ãã
- ãã¼ã¿ãã¼ã¹ã°ãã°ãæ±ãããã ãã©ãSQLã¨ããããªè©³ããç¡ããï¼
- ã¨ããããã¤ã³ããã¯ã¹ä½ãã°éããªããã§ãããããã
- æ±ããã¼ã¿å®¹éãå°ãªããã°ãªã³ã¡ã¢ãªã§æ±ãï¼Redis, Memcached?ï¼ã®ãè¯ããã
- ãã£ãã·ã¥ã»ãã£ãã·ã¥ã»ãã£ãã·ã¥
éå»åãè§£ãã¦ã¿ã
å»å¹´ã®ISUCON3ã®ç°å¢ãAWSã®AMIã®å½¢ã§æä¾ããã¦ããã®ã§ã忥ã®å¤ããå°ãããã£ã¦ã¿ãã
- ã¾ãäºäººã¨ãããããAWSç«ã¡ä¸ããMySQLãç«ã¡ä¸ãããªãã¦å°ãã
service mysql start
ãããªãã¦ã/etc/init.d/mysqld start
ã ã¨ç«ã¡ä¸ãã£ãããªããããããï¼ï¼ãããã§ããã»ã¹ã®ç£è¦ã¨ãã®ã³ãã³ãã«ã¡ãã£ã¨è©³ãããªã£ãï¼
- ãã³ããã¼ã¯ãèµ°ãããã1400ãããã
- nginxã¨ãããµã¼ããéããããã®ã§ãApacheããnginxã«ç§»è¡ãã¦ã¿ãã
- ããããã°ãWebã¢ããªã±ã¼ã·ã§ã³ã¯åæç¶æ ã§Perlãåãã¦ãããããã®ã ããApacheã¯ã©ãã§Perlã«å¦çãæ¸¡ãã¦ããã ï¼
- ã©ãããlocalhost:5000ã«æãã¦ããã¿ããã
- nginx.confã§ã«ã¼ãã«æ¥ããªã¯ã¨ã¹ããå ¨é¨5000ã«æããããã«ç·¨éãããã§CSSãèªã¿è¾¼ã¾ããªãèªä½çºçã
- è¦ç´ ãæ¤è¨¼ã§ãªã¯ã¨ã¹ããããèªãã§ã¿ãã¨ããªããCSSãlocalhost:5000ããèªããã¨ãã¦ãâ¦ã
- 調ã¹ã¾ãã£ã¦
proxy_set_header Host $host;
æ¸ãããç´ã£ããã¹ã³ã¢ã¯50ãããã¢ãããããã¼ãâ¦ã
- ãªãã¨ãªãNode.jså¨ããèªãã§çè§£ãã¦ã¿ãã
- npmã§ããã±ã¼ã¸å
¥ãããã£ã½ãã
- æåèªåã ããªãããã¹éã£ã¦ãªãã¦ã¯ã¾ã£ãã
- Node.jsã«åãæ¿ãã¦ã¿ãçµæãã¹ã³ã¢ãæ°ç¾ãããä¸ãã£ãããããã â¦ã
- npmã§ããã±ã¼ã¸å
¥ãããã£ã½ãã
ããã§äºé¸å½æ¥ã®æï¼æãããã ã£ãã®ã§ããå¯ã¾ããã
äºé¸è©³ç´°
ã¨ãã 失æ
ã ã£ãã®ããäºäººã¨ãæå¯åãã10:30ãããã«èµ·ãããã¨ã§ããï¼ãããå人ã®Skypeã§èµ·ããããï¼ã
ãããããã¾ãï¼æéãããã大ä¸å¤«ã§ããï¼ãã¨ã
ä»ã§ã¯ç®ãå½ã¦ãããªããã¤ã³ãã©çµé¨ãå°ãªãäºã«ãããã¾ãã«æµ
ã¯ããªè¨èãæ¾ã£ã¦ãã¾ããã
ã¾ãæåã¯äºç¿ãçããã¦ã¨ããããnginx+Node.jsã«ç°å¢ãå¤ãã¦åããã¦ã¿ããï¼ã¨ãããã¨ã§ä½æ¥ã«å
¥ãã¾ããã
ããããæåããã¾ããã®nginxã ã£ãã®ã§ãã¢ããªãNode.jsã«å¤ãã¦ãµã¼ãã¹ã«ã¢ã¯ã»ã¹ãã¦ã¿ã¾ããã
ããã¦åãã¦ããã®ã確èªããå¾ããã³ããã¼ã¯ãåããã¾ããã
ããã§ã¹ã³ã¢1400ãããã§ãISUCONã®äºé¸å°ç¨ãµã¤ãã§é ä½ã確ãããã¨70ä½ãããã
49ersã¨ãããã¼ã åï¼åã髿 ¡ã®49æçï¼ã ã£ãã®ã§ãã¨ãããã49ä½ç®æãããã¨ããæãã§ä½æ¥ã«åããããå§ãã¾ããã
ç¾ç¶åæ
ããã«ããã¯ãææ¡ãããï¼ã¨ãããã¨ã§å人ã調ã¹ã¦æ¥ãnewrelicã¨ãããµã¼ãã¹ã使ã£ã¦ãµã¼ãã¹ãè§£æãã¦ã¿ã¾ããã
ãã ãçµå±å¾ãæ
å ±ã¯ã/loginã¸ã®ãªã¯ã¨ã¹ããæéæãã£ã¦ããªï¼ãã¨ããã ããããããããã¨ããæãã
次ã«ãè²ã
ãããã¾ãã£ã¦ãã³ããã¼ã¯éããªããªã£ãã大å¤ã ãããgitã§ç®¡çããããã¼ãã¨ãããã¨ã§
gitã§ç®¡çããBitBucketã«ãã©ã¤ãã¼ããªãã¸ããªã¤ãã£ã¦pushããå½¢å¼ã«ãã¾ããã
åä¸ãµã¼ãã®ããã¸ã§ã¯ããè¤æ°äººã§ç´æ¥ç·¨éããå ´åã®æ¹æ³ã¯ä½ãè¯ãã®ãã£ã¦ããã®ã¯ã
æ®æ®µã®éçºãããªããªãç¡ããããªãã§ISUCONæ°¸é ã®å½é¡ãªã®ã§ã¯ç¡ããããã
ãããããã½ã¼ã¹ã³ã¼ããèªãã§ã¿ãããã¨ãããã¨ã§ãApp.jsãèªã¿å§ãã¾ããã
ä¸ã§çµæ§SQLã¯ã¨ãªãå®è¡ããã¦ããã®ã§ãå人ãslowqueryã¨ãããã®ãå°å
¥ãã¦ã
æéã®ããã£ãã¯ã¨ãªãæ¤ç¥ããæ§ã«ããã®ã¯ã¨ãªãä¸å¿ã«è§£èªãã¦ããã¾ããã
åãã£ãäºã¯ã
- ãã°ã¤ã³ãã¦mypageã«é£ã¶æ©è½ã ãããã
ãã£ãã·ã³ã°éè¡ãµã¤ã - ï¼ã»ï¼ï¼åé£ç¶ã§ãã°ã¤ã³ãã¹ã£ãã¦ã¼ã¶ã»Ipã¯BANãã
- ãµã¼ãã§ã¢ã¯ã»ã¹ãã°ã管çãã¦ã¦ãæå¾ã«æåãã¦ä»¥éã®ãã¹ã£ãåæ°ã¨ãã«ã¦ã³ããã¦ã¦ãã£ã¡ãéãã
- ãã¼ã¿ãã¼ã¹èªä½ã®å®¹éã¯æ°åMBã¨ããããªã«å¤§ãããªãã
ã¨ãããã¨ãããã§ä»¥ä¸ã®ãããªä½æ¦ãåãäºã«ãã¾ããã
- ã¢ã¯ã»ã¹ãã°ãããã¡ãã¡è¨ç®ããããããªãã¦ãæå¾ã«æåãã¦ãããã¹ã£ãåæ°ãä¿æãã¨ãã
- ãã³ããã¼ã¯ç«ã¡ä¸ãã®éã®åæåã§ãå ããããã¢ã¯ã»ã¹ãã°ããfailæ°ãäºåã«è¨ç®ãã¦ãã¼ã¿ãmemcachedã«ç½®ãã¦ããã
æ¬å½ã¯Node.jsä¸ã§ãã£ã¨ãã¼ã¿ãä¿æãã¦ããã°ããããããªããã¨æãã¾ãããã
ãªã¯ã¨ã¹ããå¦çããããã»ã¹ã¯ï¼ã¤ã§ã¯ç¡ãã®ã§ãã¼ã¿å
±æãé£ãããã ãã
ãã¨ãã£ã¦ããã»ã¹ãï¼ã¤ã«ããã¨ãã«ãã³ã¢ã®æ©æµãåããããªããªãã®ã§memcachedã«ãã¾ããã
å®è£
åã¯åæåã¹ã¯ãªãããPythonã§æ¸ãã¦ãå人ã¯App.jsã®ãç¾å¨SQLã¯ã¨ãªãæ¯åçºè¡ãã¦å¦çãã¦ããé¨åãæ¸ãæããäºã«ãã¾ããã
çµæãinit.pyã®å®æã«ãã¡ããã¡ãæéããããããã®å¾App.jsã¨ã®é£æºããããã°ããªããæ¯åä¿®æ£ãã¦ãã£ããã®ã®ã
çµå±æéãç¡ãéãã¦ãã³ããã¼ã¯ãfailããã¾ã¾ã«çµãã£ã¦ãã¾ãã¾ããï¼æå¾ã®ã¹ã³ã¢ã¯2ã§ãã(エッï¼ã
äºé¸çµäºå¾
æéå
ã¾ã§ã«çµæãåºããªãã¦æããã£ãã§ãããç«ã¦ã使¦éãã®å®è£
ãããå ´åã«ã©ãã ãã®ã¹ã³ã¢ãåºããç¥ãããã£ãã®ã§ã
ãã®ã¾ã¾å¯ãã«å®è£
ãã¦ã¿ã¾ããã
伿©ãããããµãã«ã¼ãè¦ããããªããæã¾ã§é å¼µã£ãçµæãfailããªãããã«ãªã£ã¦ãæçµã¹ã³ã¢ã5500ãããã§ããï¼nemupm/isocun4_preã»GitHubï¼ã
å®è£ ã§ã¤ã¾ã¥ãã¦ãç¹ã¯ã
- ãã¼ã¿ãmemcachedã®ã¡ã¢ãªãµã¤ãºä¸éå¤ãè¶ ãã¦ã¦ä¸é¨ãæ¶ãã¦ãã
- memcachedã¨ã®ããåãã®éã«JSONã«ã·ãªã¢ã©ã¤ãºã¨ãããªãã¨ãããªããã¨ã«å¾ã§æ°ä»ããã
- ãªã¯ã¨ã¹ãã®ãã¡ã«ãã¼ã§ãã¦ããªããã¿ã¼ã³ãçµæ§ãã£ã
ã¨ããæãã§ããã
ã¾ããå¾ã§è¦ç´ãã¦ã¿ã¦ãçµå±æ¯åã·ãªã¢ã©ã¤ãºã¨ãã«æéæãã£ã¦ãã ããããã
åæåãjsã§ãã£ã¦ã·ãªã¢ã©ã¤ãºä¸è¦ã«ããã»ããè¯ãã£ããã ãããªã¨æãã¾ããã
ã¾ã¨ã
以䏿æ³ã§ãã
- ãããã°ããããé£ããã£ãã§ãã
- ä»ã®æ¹ã®ããã°ã¨ãèªãã§ãã¨ãnginxã®ã¢ã¯ã»ã¹ãã°ãç¬èªã«åæããããã¦å¿ è¦ãªæ å ±ãéãã¦ãã¦ãæå¿ããã
- æ¹éã¯å²ã¨æ¬è³ªã¨ããã¦ãªãã£ãã¨æããã©ãå®è£ åãªãéããï¼
- ã¤ã³ãã©ç¥èãç¡ãããã¦ããããããæã¯ãããããã¨ãã常èãç¡ãã¦æéãããã£ãããSQL以å¤ã®ããã«ããã¯ã®ææ¡ãåºæ¥ãªãã£ãã
ISUCONã«åå ãã¦ã¿ã¦ä»åæ¬å½ã«è¯ãã£ããªã¨æã£ãã®ã¯ãåã«è¶³ããªãç¥èã®é¨åã£ã¦ã®ãå
·ä½çã«è¦ãããã¨ã§ãã
ãããããããåå¼·ã£ã¦æãã§ã¯ãªããä¸ãããã課é¡ã楽ããã§è§£ãã¦ãã£ã¦ã
çµãã£ãå¾ãidobataã§ãã£ãããçºãããããã°ãèªãã§è²ã
èãã¦ãã¨ããããã«ã
ãããæ¥½ããåãçµããã®ãæé«ã§ããã
ã¿ãªããæ¬å½ã«ãããã¨ããããã¾ãï¼
æ¯éãæ¬¡ã¯äºé¸çªç ´ãç¾å®çã«çããã ãã®ç¥èãã¤ãã¦ãååº¦ææ¦ãããã§ãï¼