ã¿ã¤ãã«ã®éãã§ãã
å
æ¥è¡ããããIikanjini Speed Up Contestã®ç¥ã§ããã¨ããã®ISUCON5ã®æ¬é¸ã«ã¯ã¦ãªã®è¥æã¨ã³ã¸ãã¢3人ã«ãããã¼ã ãã¯ãã¡ãããã§åå ããè¦äºæ¨æãã¦ãã¾ãããæå¾ã®ã¹ã³ã¢è¨æ¸¬æã«åèµ·å試é¨ãã¯ãªã¢ã§ããªãã£ãã®ã§æçµã¹ã³ã¢ã¯ãªãã§ãçµäºç´åã®ãã³ããã¼ã¯ã§åºããå¤ã¯4ä¸ç¹å°ã ã£ãã®ã§ä»®ã«åèµ·å試é¨ã§åç¨åº¦ã®ã¹ã³ã¢ãåºãã¦ããã¨ãã¦ã9ä½ã©ã¤ã³ãã¨ãããã¨ã«ãªãã¾ããisucon.net
äºé¸ã好æ績ã§èª¿åã«ä¹ã£ã¦ããè¨äºã¯ãã¡ãã§ããastj.hatenablog.com
æ¬é¸ã®ææ³
æåã«ãä»åã®çµäºç´å¾ã®ãã®ãã¤ã¼ãããã£ã¦ææ³ã¨ããã¦ãã ããã
ããããã
— Julius/HP (@ast_j) 2015, 10æ 31
ãµãããã
æ¬é¸ã®ãé¡ãä½ã«ãªããã¯ããããåããã¦ãã¾ããããåè«ååã«è¨ããã¦ãããã¤ã¯ããµã¼ãã¹ã¨Dockerã®ãã¡åè ã大æ£è§£ã¨ããæãã§ãããã¤ã³ãããã¯ã·ã§ã³ã®ã¹ã©ã¤ãã§ãã¤ã¯ããµã¼ãã¹ã¨ããåèªãåºã¦ããã¨ãã¯ã¾ããã¼æ¥ããã¼ã¨ããæãã§ãããã¡ããã©åæ¥ã®æ¼ä¼ã¿ã«ç¤¾å ã®ãã¤ã¯ããµã¼ãã¹ã®ä½¿ãæ¹ã«ã¤ãã¦(ãã¼ã ã¡ã³ãã¼ã§ã¯ç¡ãå¥ã®)社å ã®ã¨ã³ã¸ãã¢ã¨è©±ããã¦ããã¨ãããªã®ã§ã¿ã¤ã ãªã¼ã ãã¨æã£ããã©å½¹ã«ç«ã¦ããã¨ã¯åºæ¥ãªãã£ãã
ã·ã¹ãã æ§æçãªã¨ããã«ã¤ãã¦ã¯ã主ã«æ
å½ããid:y_uukiããããã®ãã¡ããã°ãæ¸ãã¦ãããã¨æã£ã¦ããã®ã§å²æãã¾ããä»åæ§æé¢ã¯ã»ã¼ä¸¸æãã«ãã¦ãã¾ã£ãã
æ¢ã«åæã§èªããã¦ãã¾ãããæ¬é¸ã¯ãªãã¨RDBMSãMySQLã§ã¯ãªãPostgreSQLã§ãããããã£ã¨ãã¤ã¤ãy_uukiãããä¸æºåããã¦ããéæã ã£ãã®ã§ãã ã£ã¨MySQLã«æ¸ãç´ããåãè¡ã£ãã®ã§ãã(æå ã®MySQL dbã¨çµã¿åããã¦åãããã«ããã®ã¯ããã§ãã)ã
- ãµã¼ãä¸ã§mysqldåãããã¨ãããå¦ã«ããã£ã
- PostgreSQL(æ¨æºSQL)ã¨MySQLã§
||
æ¼ç®åã®æåãéããã¨ã«ããããã§ãã¯ãµã è¨ç®ãperlã«ç§»ããæã«åããªãã¦ããã£ã¦ãæéãé£ã£ã¦ãã¾ã£ãmysql> SET sql_mode='PIPES_AS_CONCAT';
ã¨ããæãã§ãçµæçã«ã³ã¹ãã«è¦åããªãå¤æ´ãã¶ã¡ããã§ãã¾ã£ãã®ã§å¤æãã¹ã ã£ãã¨åçãããã§ãããã¹ã°ã¬ã®ã¾ã¾ã§ã¯dbåè² ã«ãªã£ãã¨ãã«ä½ãã§ããªãã¦ã¾ããããã¨ããæè¦ã§é²ãã¦ãã¾ã£ãã®ã§ããããã³ããã¦DBãå¾éããç¡ããã¨ãå ã«è¦ã¦ãããªãå°ãªãã¨ãå¾åãã«ããå¤æã¯ã§ããããªããã¨ããã®ãäºå¾ã®æ¯ãè¿ãã§ããè¨æ¸¬ããã¨ãã話ã
ä»åãæ¨æãã¨ã¿ã¤ãã«ã«æ¸ããã®ã¯ãã¹ã³ã¢ãããã«ä¼¸ã°ããªãã£ã+failããã¨ããã®ã¯å¿è«ãªã®ã§ããããã®çµæã¨ããããã¯å
容ããã¾ãã«æ¨æã ã£ãã¨ããã¨ããã大ããã§ããã¢ããªã±ã¼ã·ã§ã³åä½ã§éãã¦ãé¨åã®å¤æ´ããªããªãä¸æããããã«ããã§æéã¨å´åã使ã£ã¦ãã¾ããæ¬ä¸¸ã§ããã¯ãã®ãµãã·ã¹ãã ãªã¯ã¨ã¹ãé¨åã®æ¹åã«ã»ã¨ãã©æãå²ããªãã£ãã®ã§ãããã§ã¯æ¬è³ªçãªãã¨ã¯ä½ãåºæ¥ã¦ãªãã¦æ¨æã ããã¨ããæ°æã¡ã§ããã¾ãã
社å
ã®æè¿ã®ãµãã·ã¹ãã ã®ä½¿ãæ¹ã«åããç´æ¥ã¢ããªã±ã¼ã·ã§ã³ããã»ã¹ããå¤é¨ãã¤ã¯ããµã¼ãã¹ãå©ãã®ã§ã¯ãªããã£ããnginxãæããã¨ãããã¨ã§nginxãéãããã«ãã¦ãã¤ãã§ã«nginx層ã§ãã£ãã·ã¥(å
·ä½çãªå
容å
¨ãè¦ã¦ãªãã£ããã©ä»ãªãã¸ããªè¦ãã¨ãã1åãã£ãã·ã¥ã ã£ã)ãæããã¨ã§ã¹ã³ã¢ã人権ã®ããç¨åº¦ã«ã¯ä¼¸ã°ããã®ã§ãããããã§æãæ¢ã¾ã£ã¦ãã¾ã£ã¦ãã以ä¸ã®æ¹åã«ã¯ãã¾ãè¸ã¿è¾¼ãã¾ããã§ãããnginxéãå
ã
ã®ã¡ãªããã®1ã¤ã«ãªã¯ã¨ã¹ããã°ã®åéããã£ãã®ã§ããããã®ãªã¯ã¨ã¹ããã°ã®åæãä»ã²ã¨ã¤æããªãã£ãã®ã¯çæ¨ããªã¨æã£ã¦ãã¾ãã
â¦â¦ã¨ããã¾ã§æ¸ããã¨ããã§æãã ããããã©ãéµä¾¿çªå·ããå°åæ
å ±ãå¼ãAPIã«é¢ãã¦ã¯id:ntakanashi ãããå
ã«ã¬ãã¨æå
ã«dumpãä½ã£ã¦èªã¿è¾¼ã¾ããã¨ããã®ãç¨æãã¦ããã®ã§ãããå®è£
ãã¦ããã£ã¦ãã¨ãã¯ããã§ãµã¯ã»ã¹ããã¨ããé°å²æ°ããã£ããã©ãçµå±ããã ãã§ã¯ããã¾ã§åçãªã¹ã³ã¢ã®æ¹åã¯ã§ããªãã£ãããã«è¨æ¶ãã¦ãã¾ãããã°ã¯ãã¡ããã¡ããã¦ãã¦æ¢ã«æ¯ãè¿ãã®ãå°é£ã
éä¸ã§ä¸åº¦åèµ·åã¯ãã¦ãã¦ãã®æç¹ã§ã¯failãã¦ããªãã£ãããã«æãã®ã¨ããã以éã¯åèµ·åã«ãã£ã¦å£ããå¤æ´ãå ãã¦ããªãã¤ããã ã£ãã®ã§ãfailããã®ã¯APIã®ãã£ãã·ã¥ãç´ æ´ã ã£ãããã¬ã¹ãã³ã¹å
容ã®ãã§ãã¯ã§ã³ã±ãã®ã§ã¯ãªããã¨æã£ã¦ãã¾ããä½æ¥ä¸ã«ãæ°ååºã¦ãããã ããã©ãã¾ãé »åº¦ãé«ããªãããã¤å¸¸ã«ææ¢ãç¶æ
ã ã£ãã®ã§ãã¾ã深追ãã§ããªãã£ãâ¦â¦ã¨ããç¶æ³ã§ãããã¾ãããããããããã£ã¨è´å½çãªã¨ããã§ä½ãã³ã±ãã®ãããããªãããã©â¦â¦
("åããã¼ã¯ã³ã§åæã«è¤æ°ãªã¯ã¨ã¹ããæãã¦ã¯è¡ããªã"ã¨ããå¶ç´ããã£ãAPIã«å¯¾ãã¦ãç¹æ®µã®é
æ
®ãã§ãã¦ããªãã£ãã®ã§ãçµäºç´åã«å
¥ããã¦ã¼ã¶å¨ãã®ãã£ãã·ã¥ã§ã¹ã«ã¼ããããä¸ãã£ãçµæã¨ã©ã¼ééçãä¸ãã£ã¦ããå¯è½æ§ã¯ãããã)
ææ
äºé¸ã¨æ¬é¸ãéãã¦ãç¹ã«å人çã«å¼·ãæã£ãã®ã¯ããæ®æ®µãã£ã¦ããã¨ã¯ã§ãããæ®æ®µãããªããã¨ã¯ã©ããããããªããã¨ãããã¨ã ã£ãããªã¨æãã¾ããäºé¸ã§ã¯perl + MySQLã®webã¢ããªã±ã¼ã·ã§ã³ã§MySQLã®ã¯ã¨ãªãå¾éã¨ãããããæå³ä¸çªæ®æ®µãã£ã¦ããã¨ã«è¿ãæ§æã ã£ãã®ã§ãä½ãããã°ãããæ³åãã¤ã(åãå¹ã)ããå¿
è¦ãªæ¹åãå®éã«é²ããããæå¿ããå¾ãããâ¦â¦ããã¹ã³ã¢ãããã£ããä¸æ¹ã§ã(ä»ã®ãã¼ã ã¡ã³ãã¼ã¯åãããªããã©)åã¯æ®æ®µRedisããã¾ã触ããªãã®ã§ãRedisã«ãã¼ã¿è¼ãããã¨ããã¨ã·ãªã¢ã©ã¤ãºã ã®ä½ã ã®ã§ä½ãã¨ã¤ã¾ã¥ãã¾ãã£ã¦æãã¾ããã§ãããæ¬é¸ã¯ãããä¸å±¤å¦å®ã«åºãç¶æ
ã§ãå
¥ç¤¾ãã¦ãããã¤ã¯ããµã¼ãã¹ã¸ã®ãªã¯ã¨ã¹ãã®ãã£ãã·ã¥æ¦ç¥ã«é ãæ»ãå±é¢ããã¾ããªãã£ã(ãªã¯ã¨ã¹ãã«å¯¾ãã¦ããã¾ã§ã·ãã¢ãªãµã¼ãã¹ã¸ã®ãªã¯ã¨ã¹ããæ±ãæ©ä¼ããã¾ããªãã£ã)ã®ã§ããã®ãããã¸ã®åãå
¨ãåããªãã£ããªãã¨æã£ã¦ãã¾ããä»®ã«æéããã£ãã¨ãã¦ãããã¼ã¯ã³å¨ãã®ä»æ§ãHTTP2ã«æ°ã¥ãããã¨ããã¨ãåèªèº«ã«é¢ãã¦ã¯ãã¼ã§ã¯ãªãããªã¨â¦â¦
ãã ãæ¬é¸ã¯æ®å¿µãªçµæã§ããããäºé¸ã«é¢ãã¦ã¯ãæ®æ®µãã£ã¦ããã¨ãããã°ãããªãã®çµæãåºãããã¨ããæå³ã§ããã¼ã ã¯ãã¡ããã®å®åãç¥ããã¨ãã§ãã¦å¤§å¤ããã£ããªã¨æã£ã¦ãã¾ãã263ãã¼ã ãåºå ´ããä»åã®ISUCONäºé¸ã§ãæ¬æ¥ãªãæ¬æ¥ã¨ãããããªåéã§ããã°5ä½ã¨ããæ績ãåºããã¨ãã§ããã¨ããã®ã¯èªã£ã¦ãããããã¨ããã®ãæ£ç´ãªææ³ã§ãã
å¾ã¯ãã¯ãããã¾ãã«ãåæ©çãªãã¨ã§ã¯ããã®ã§ããããæ¨æ¸¬ãããªãè¨æ¸¬ãããã¨ãããã¨ã«å°½ãããªã¨æã£ã¦ãã¾ããè¨æ¸¬ãã¦ããã®ä¸ã§ã©ããããã«ããã¯ãªã®ããå¤æã(ã¦APIé¨åã®æ¹åã«æ³¨åã)ãªããã°ãªããªãã£ãã¨ãä»ã«ãªã£ã¦ã¯æãã°ããã§ãã
ãããã«
äºé¸ãæ¬é¸ãã¨ãã«ããã¸ã質ã®é«ãåé¡ãå¿«é©ãªãã³ããã¼ã¯ãã¼ã«ãç¨æãã¦ããã ããã¾ãæ¬é¸ã®è¨åé¢é£ã大å¤å
å®ãã¦ãã(ãã¼ã ç¶æ³ã«ã¾ã£ããä½è£ããªãä¸åã¯ãå¼å½ããã ãã¾ãããããããã£ãã§ãï¼)ã¾ããã
ããã ãã®è¦æ¨¡ã®ã³ã³ãã¹ããå®æ½ãããéå¶ä¸»å¬åè³ã®çæ§ã«ã¯æ¬å½ã«é ãä¸ããæãã§ãããããã¨ããããã¾ããã
ããæ¥å¹´ä»¥éãã¾ãéå¬ãããããã§ããã°ãæ¯éãã¯ã¼ã¢ããããããªã¯ãã¡ããã§åææ¦ãããã¨æã£ã¦ããã¾ãã
ãã©ãã®ã£ã©ãªã¼
åå è³ã¨ãã¦ããã ããããã«ãã£?çãªä¸ã«å
¥ã£ã¦ãããã©ã¦ã³ããã§ããææ¥ããåã®ä»£ããã«ä»äºãã¦ãããäºå®ã§ãã
ä¼å ´æ¡å
ã®åçã§ãããããæ®ã£ãé ã¯å
æ°ããã£ãã
æ親ä¼ã§åºãããåè³ã®NHNãã³ã©ã¹ããã®æä¾ã«ãã寿å¸ã§ããããããããã ãã¾ããç¾å³ããã£ãã§ã寿å¸ã¯æé«ã
æ¬é¸ä¼å ´ã§ãããã«ãªã¨ããçºããããã¦ã£ã³ã®æ¸è°·ã®æ§åã§ããããè¦ã¥ããã§ãã交差ç¹ã®å·¦ä¸ã®é»ãè ¢ãã¯äººéã§ãã
ä½è«ãªãä½è«
æ°åãå ¥ãã®ããã«ã¢ã¤ãã«ãã¹ã¿ã¼ã®ã©ã¤ãTã·ã£ã(ä»å¤ã®10å¨å¹´ã©ã¤ãã®Tã·ã£ãã§ãã)ãçã¦ããã®ã§ãããæå¾ã®è¨å¿µåçã«ã°ã£ã¡ãã¢ã¤ãã¹Tã·ã£ã姿ã§åã£ã¦ãã¾ã£ã¦ããã¾ããå ¬éããããã®ãªã®ãåããã¾ããããå ¬éããããæ¯éã確èªä¸ããã