ISUCON1, 2ã¨ãfujiwaraçµãã§é£è¦ãã2013å¹´ã«ã¯åºé¡ãæ å½ãã¾ããããä»å¹´ã¯ä¸åæ¦è ã¨ãã¦ææ¦ãããã¨ã«ãªãã¾ããã
- ä»å¹´ã¯å¼ç¤¾ããã®æ¬é¸æ ããªã(å ±å¬ã§ã¯ãªãã®ã§)ãäºé¸è½ã¡ãããããã¾ã§
- ãã¼ã 㯠ISUCON 1,2ã®ã¡ã³ãã¼ãèªå以å¤å ¨å¡éè·(â¦) ãã¦ãã¾ã£ããããå»å¹´ã®åºé¡æ å½ @acidlemn @handlename ã§æ°è¦ç·¨æ
ã¨ãããªããªããã¬ãã·ã£ã¼ã®ãããç¶æ³ã§ãããããããããäºé¸2æ¥ç®ã®æ«å®1ä½ã¹ã³ã¢ãåºããã¨ãã§ãã¾ããã(å¾è¿°ãã¾ãããä¸é¨ã¬ã®ã¥ã¬ã¼ã·ã§ã³ã«å¼ã£ãããå¯è½æ§ã®ããä¿®æ£ããã¦ãããããå¤±æ ¼ã¨ãªãå¯è½æ§ã¯ããã¾ãããã®å¤æãä¸ãããå ´åã¯ãå½ç¶åãå ¥ãã¾ã)
éå ±çµæã¯ãã¡ãã§ã ISUCON4 オンライン予選 二日目の結果発表 : ISUCON公式Blog
ä¾å¹´ã®ãã¨ãªããã大å¤æ¥½ããã¤ãã³ãã§ãããéå¶ã»åºé¡ããã¦ããã ããçæ§ãããã¨ããããã¾ãï¼
å½æ¥ã®è©³ããæ¦æ³ã«ã¤ãã¦ã¯ãã¼ã ã¡ã³ãã¼ã®è¨äºãé常ã«è©³ããã®ã§ããã«è²ãã¨ãã¦ãå ¨ä½çã«èãã¦ãããã¨ãªã©ãè¨é²ãã¦ããã¾ãã
- #isucon 2014にfujiwara組で出場して予選2日目暫定1位を取りました - beatsync.net
- #isucon 4にfujiwara組として参加しました - handlename's blog
åæ¥ã¾ã§
ãã¼ã ç·¨æ決å®å¾ã¯ç¹ã«äºç¿ãããæéããªãããªãªã¼ã¹ããã°ããã®ãµã¼ãã¹ã®å¢å¼·ãè² è·å¯¾çãbashã®èå¼±æ§ç¥ããAWSã®åèµ·åç¥ãã«ç¿»å¼ããã¦ãã¾ããããã®ããæºåã¨ãã¦ã¯äºé¸1æ¥ç®ã®åæ¥ãã©ã³ããé£ã¹ãªãã軽ãæ¹éã話ãããããã§ãã
ã¡ã³ãã¼ã®å½¹å²ã¯ãã£ããã¨ããã¦ããã¾ã
- @handlename : 主ã«ã³ã¼ããæ¸ãæããå®è£ æ å½
- @acidlemon : @handlename ã¨å ±ã«ã¢ããªã±ã¼ã·ã§ã³ã®å ¨è¬æ å½
- @fujiwara : ç¶æ³èª¿æ»ãããã«ã¦ã§ã¢è¨å®ãä¸åãæ å½
ãã以å¤ã«æ±ºãããã¨ã¯ã
- è¨èªã¯åºæ¬Perl
- é¡æã«ãã£ã¦Goãé¸æããå¯è½æ§ã¯è¦éã«å ¥ãã¦ãã
- ä¼ç¤¾ã®ä¼è°å®¤äºç´åã (ãªãã£ã¹ã§åå ãããã¨ã«ãããã)
- ãæ¼ã飯ã¯å¤ã¸è¡ãæéããã£ãããªãããå¼å½ãæã¡è¾¼ã¿
- çããã®ãå¿ããã«
- åæ¥ã¾ã§ã«AWSã§IAMã®ã¢ã«ã¦ã³ããä½æããå人ãã¨ã«æ¸¡ã
- Github ã® private repo ãä½æãã¦ãã¢ã¯ã»ã¹ã§ãããã¨ã確èªãã¦ãã
- 社å IRCã¸ã®éç¥ãªã©ãä»çµã¿ãã§ãã¦ããã®ã§ãæ®æ®µä½¿ãæ £ãããã®ã使ã
- äºé¸ãã¼ã¿ã«ãµã¤ãã«ã¢ã¯ã»ã¹ãã¦ãã
- ãµãã¼ããã£ããã® idobata ã«ãã°ã¤ã³ãã¦ãã
å½æ¥æã«æ ã¦ãªãããã«ãæä½éã®ãã¨ã ã確èªãã¾ãããåºé¡å 容ã®å±±ããã¯ã ãããå¤ãã®ã§ããã ãç¡æå³ãªã®ã¨ãäºæãæã¤ã®ã¯ããã£ã¦å±éºãªã®ã§ãã¾ããã
éå»ã®çµé¨ãããISUCONå½æ¥ã«ã¯æ®æ®µãã£ã¦ããªããã¨ããã£ããã¨ããªããã¨ã¯ã¾ãã§ããªãã®ã§ãèããªãã¦ããä½æ¥ã¯æ¥µåãªããã®ãéè¦ã ã¨æãã¾ãã
å½æ¥
éå§ãã12æã¾ã§
10æã®ç«¶æéå§å¾ãã¾ãã¤ã³ã¹ã¿ã³ã¹ãèµ·åãã¦ã½ã¼ã¹ã³ã¼ããGithubã¸pushã@acidlemon 㨠@handlename ã«ã¢ããªã±ã¼ã·ã§ã³ã®æå確èªã¨Perlå®è£ ãèªã¿è¾¼ãã§ããã£ã¦ãããã¡ã«ããµã¼ãã¾ããã®åºæ¬è¨å®ãçµãããã¾ãã
ã¨ãã£ã¦ãOSãAmazon Linuxã ã£ããããç§ä¼ã®ã¿ã¬ç㪠Shell script 㨠Chef cookbook (CentOS 6, Amazon Linux 両対å¿) ãæµãã ãã§æ¸ã¿ã¾ããã
ãã¤ãã®ã¢ã«ã¦ã³ãåã¨SSHéµãå°ç©ãã¼ã« (ack, ag, ltsvrã¨ã)ãå人ã®è¨å®ãã¡ã¤ã«(.screenrcã¨ã) ã¾ã§ä¸æ°ã«æãã®ã§ãããã§ä½æ¥ã®ã¹ãã¬ã¹ããªããªãã¾ãã
ããããæå³ã§ã¯ãåãä¼ç¤¾ã§ (ãã¼ã ã¯å¿ ãããåãã§ã¯ãªãã§ãã) åããããªæ¥åããã¦ããã¡ã³ãã¼ã§éãã¡ãªããã¯å¤§ããã®ããªã¨æãã¾ããfujiwaraçµã¯éå»3åããã¹ã¦ãã®æç¹ã§å¨ç±ãã¦ãã社å¡ã§æ§æãã¦ãã¾ãã
ããã«è¦ã¦åããæä½éã®ã¤ã³ããã¯ã¹ãMySQLã«è¨å®ããéçãã¡ã¤ã«ãnginxããé ã£ãã¨ããã§17,000ç¨åº¦ããã¼ã«ã«ãã¼ãããµãã¯é »åºåé¡ãªã®ã§ upstream keepalive ã®è¨å®ã§ç°¡åã«è§£æ¶ãCPUãæããã«ä½ã£ã¦ããã®ã§ --workload 3 ã«ãã¦28,000ç¨åº¦ã12ææç¹ã®ã¹ã³ã¢ã§ããã
ã¹ã³ã¢ã®ç«ã¡ä¸ãããæ©ãã§ããã¨ãçµç¤ã®ã³ã¼ãä¿®æ£ã«æéãå²ããã®ã§åéãåºãã®ã¯å¤§äºããªã¨ã
12æã15æ
å®ã¯äºé¸1æ¥ç®ã®ã¹ã³ã¢ã®ä¸ããããã観å¯ãã¦ã以ä¸ã®ãããªç®è«è¦ãç«ã¦ã¦ãã¾ããããããããã¨ãã§ããã®ã¯2æ¥ç®ãæå©ãªç¹ã§ããâ¦
- æ©ã段éã§å¤§ããã¸ã£ã³ãã¢ããããæããã
- æéçã«ææ¬çãªã³ã¼ãä¿®æ£ãªã©ã§ã¯ãªããä¸åãã®è¨å®ãªã©ã§å°éã§ããã¯ã
- ãããããããä¸ããããªãã¦è¦ããé¡æã½ã
- æå¾ã®1æéã«åå¤ããä¸ä½ã«é£ã³è¾¼ããã¼ã ã (æ¯åã§ãã) ããã®ã§ãåã¡æã確å®ã¬ãã«ã«ããã«ã¯ã³ã¼ãã«ç¸å½æãå ¥ããå¿ è¦ããããã
- æ¨å¹´ã¯äºé¸ä¸ã®æé«ã¹ã³ã¢ã3ä¸ç¨åº¦ã ã£ãã®ã§ãæ¨å¹´ãããæ´ã«é«qpsãªå±éã«ãªããã
ãã®ãããåå伸ã°ãã¦ãããã®ã¾ã¾ã®å»¶é·ã§5,6ä¸ç¹ã«ããããã«ãªãå ´åãé ãã¨ã14ã15æã«ã¯å¤æãã¦ã大ããã³ã¼ããæ¸ãæããæ¹åã«è»¢æããããã¨ããæ¹éã¯å ±ææ¸ã¿ã§ããã
15æã18æ
ä¸ä½ãçããæ³å®ã¨ãã¦60,000ç¹ãåºãããã«ã¯ã60,000 / 60sec = 1,000 qps ã§ã¢ããªã±ã¼ã·ã§ã³ãåãå¿
è¦ãããã¾ããã¤ã¾ãã1ãªã¯ã¨ã¹ãã«å¹³å 1ms ãã使ããªãã
nginxã®ã¢ã¯ã»ã¹ãã°ã§ request_time, upstream_response_time ã観å¯ããç¾ç¶ã§ãã»ã¼ 1ã5ms ã§è¿ãã¦ãããã®ã®ããããå¹³å 1ms ã¾ã§ä¸ããããã«ã¯â¦
ããã¾ã§ãã¼ã¿ã¹ãã¢ã¯ç´ ç´ã«MySQLã使ã£ã¦ããã®ã§ãslow query log ã®é¾å¤ã 1ms ã«è¨å®ãã¦ãã°ã観å¯ããMySQLã§ã¯ã¢ããªã±ã¼ã·ã§ã³ã®å¹³åã¬ã¹ãã³ã¹ã 1ms ã«åããã®ã¯ç¡çã§ãããã¨å¤æãã¾ããã
ã¨ãããã¨ã§ã以ä¸ã®ãããªæ¹éã§ã¢ããªã±ã¼ã·ã§ã³ã«æãå ¥ãã¾ããã
- ãã³ãèµ°è¡ä¸ã«ä¸åå¤æ´ããªãã¦ã¼ã¶æ å ±ã¯ã¢ããªã±ã¼ã·ã§ã³ããã»ã¹ã®ãªã³ã¡ã¢ãªããã·ã¥
- ãã¼ã¿ãå¢ãã login_logs 㯠Redis ã«ãããbanã®å¤æãRedisã§è¡ã
- æçµçã«ã¯ãã¼ã¿ä¿å ¨ã®ãããRedisããMySQLã«æ¸ãæ»ã
æåããèªåã¯ã³ã¼ãã¯èªããã©æ¸ããªããã¨æ±ºãã¦ããã®ã§ãå®è£
㯠@handlename, @acidlemon ãå®å
¨ã«ä¿¡é ¼ãã¦ä»»ãã¾ãã3人ã§å¯ã£ã¦ããã£ã¦ã³ã¼ããæ¸ãã¦ã conflict ããããã¦ãããªãã¨ããªãã§ããã
ããã«ã¦ã§ã¢æ§æ
æçµçã«ã¯ã以ä¸ã®ãããªæ§æã«ãªãã¾ãã
- ããã³ã㯠Varnish
- éçãã¡ã¤ã«ã¯ nginx ã«æ¯ã(Varnishããã£ãã·ã¥)
- / ã¸ã®ã¢ã¯ã»ã¹ã§ãªãã¡ã©ããªããã®ã¯åä¸å 容ãªã®ã§éçãã¡ã¤ã«ãé ã
- ãã以å¤ã®ã¢ã¯ã»ã¹ã¯ nginx ãä»ããç´æ¥ app ã«æ¯ã
- ã¤ã¾ã nginx ã«ã¯æåã®æ°ã¢ã¯ã»ã¹ããè¡ããªã
ãã¼ã¿ã¹ãã¢ã¯ãåè¿°ã®ããã«ãã³ãèµ°è¡ä¸ã¯åºæ¬çã«å ¨ã¦ Redisãæå¾ã® /report ã¸ã®ã¢ã¯ã»ã¹æã«MySQLã«æ¸ãæ»ãã¦ãã¾ãã
Varnishã®è¨å®ã¯ä¸è¿°ã®æ¡ä»¶åå²ãç´ ç´ã«è¨è¿°ãã¦ã以ä¸ã®ãããªæãã§ããnginxã®ifã¯è¤éãªæ¡ä»¶ãæ±ãã®ãé£ããã®ã§ãããããå ´é¢ã§ã¯ Varnish 便å©ã§ããã
ã¡ãªã¿ã«ãã®ãããªè¨å®ã¯ 2013年の社内ISUCON ã§è¡ã£ããã¨ãããã®ã§ãå½æã®è³æããã³ãããã¦æ¸ãæãã¾ããã
import std; backend nginx_static { .host = "127.0.0.1"; .port = "81"; } backend app { .host = "127.0.0.1"; .port = "8080"; } sub vcl_recv { if (req.http.x-forwarded-for) { std.collect(req.http.x-forwarded-for); } if ( req.url ~ "/stylesheet" || req.url ~ "/images" || (req.url == "/" && req.http.referer !~ "^http://" ) ) { set req.backend = nginx_static; return (lookup); } set req.backend = app; return (pass); }
æå¾ã®(ç念ã®)ä¸æ
ããã¯åè¿°ãããã¬ã®ã¥ã¬ã¼ã·ã§ã³éåã®æ¸å¿µãããæã§ãã
benchmarkerãã¬ã¹ãã³ã¹ã«å«ã¾ããHTMLã®ã解æãã¦ã¹ã¿ã¤ã«ã·ã¼ãã«ã¢ã¯ã»ã¹ãã¦ããããããããåé¤ããã¨éçãã¡ã¤ã«ã¸ã®ã¢ã¯ã»ã¹ãæ¿æ¸ãããã®åã¢ããªã±ã¼ã·ã§ã³ã«å¦çãåããã¨ãã§ããããã¹ã³ã¢ãåä¸ãã¾ãã
ãè¦ãç®ã極端ã«å¤åããªããï¼ã人éãJavaScriptæå¹ãªãã©ã¦ã¶ã§ã¢ã¯ã»ã¹ãã¦å¤æãããã¨ããèªèãéå¶ã«ç¢ºèªãããããã¿ã°ã®åºåã JavaScript ã® document.write() ã«ãã£ã¦è¡ãããã«ä¿®æ£ãã¾ããã
ã¬ã®ã¥ã¬ã¼ã·ã§ã³ã«ã¯ãDOMæ§é ãå¤åããªããã¨ããé
ç®ãããã®ã§ãããéçHTMLã¨ãã¦è¦ãå ´åã«ã¯ããªããªã£ã¦ããã®ã§å¤åãã¦ããã®ã§éåã®å¯è½æ§ããã§ããã
JavaScriptãåä½å¾ã«ã¯å
ã¨åä¸ã®DOMæ§é ã«ãªãâ¦â¦ã¨å¼·å¼ã§ããªããã¨ã¯ãªãã®ã§ããããã®ç¹ã«ã¤ãã¦ã¯éå¶ã®å¤æãä»°ãã¾ãã
æå¾ã®ãã°
æçµã¹ã³ã¢ç»é²ã 17:57 ã¨ããçµäº3ååã«ãªã£ãã®ã¯ããã§å¼µã£ã¦ããããã§ã¯å ¨ããªããå®ã¯ /report ã®æ´åæ§ãã§ãã¯ã§ãã³ãã失æãã¦ãã¾ããã
ã¨ãããã¨ã«çµäº12ååã«æ°ãã¤ããã¨ãã«ã¯ãã¼ã å
¨å¡å¤§æ
ã¦ã§ãããã@handlenameã /report ã®çµæã«å«ã¾ãããã¼ã¿ã®ãä½ãããã«MySQLã«ä¿åããé åºãéè¦ã§ãããã¨ãããã¨ãææããããã«ã®ãªã®ãªã§ä¿®æ£ãã¦ã¹ã³ã¢ãåºããã¨ãã§ãã¾ããã
äºäººãã½ã¼ã¹ã³ã¼ããã¡ããã¨èªã¿è¾¼ãã§ããã®ããæå¾ã®æå¾ã§å¥åããã®ããªã¨æãã¾ãã
äºé¸ãæ¯ãè¿ã£ã¦
æçµçã«ç念ã®ä¸æã§2æ¥ç®ãããã«èºãåºã¦ãã¾ã£ãã®ã¯ãããªãå¾®å¦ãªæ°åã§ã¯ããã¾ããããã®ãããã®å¤æã¯ãç¹°ãè¿ãã«ãªãã¾ããéå¶ã«ãä»»ããã¾ãã
ããæ¬é¸ã«åºãããããã¾ããããããé¡ããããã¾ãï¼