ä»å¹´ããã¤ãã®ã¡ã³ãã¼(pgmot, syusui)ã§ããã¼ã 7å¹´ç®ãã¨ããååã§åå ãã¦ã12ä½ + æ ªå¼ä¼ç¤¾ã¢ã¼ã¯ã¨ãã¸ã»ã¹ãã¼ã¹ãæã¡ä¸ãæåè³ãè³ãããã ãã¾ããï¼

è¡æéçºç¾å ´è¦å¦ãã¢ã¼ã¯ã¡ã³ãã¼å ¨å¡ãæ°ã«ãªã£ã¦ããã®ã§ã¨ã¦ãå¬ããã§ãã ãã£ãããªã®ã§ã¹ã³ã¢ã䏿°ã«ä¸ãã£ãçç±ã«ã¤ãã¦ãå¾ãã®æ¹ã«æ¸ãã¦ãããã¨æãã¾ãã
è¨èªã¨ãã¼ã«
ISUCON 9ããããããã£ã¨Goè¨èªã§åå ãã¦ãã¾ãã èªåã¯æ®æ®µGoè¨èªãã»ã¼æ¸ããªãã®ã§ãæ¯å¹´ISUCONã®ã¨ãã ãGoè¨èªãæ¸ãã¿ããã«ãªã£ã¦ã¾ãã
åæãã¼ã«ã¯kataribeã¨pt-query-digestã使ã£ã¦ãã¾ãã alpã人æ°ãããã§ãããækataribeã使ã£ã¦ãããã®ã¾ã¾ä½¿ãç¶ãã¦ãã¾ãã ä»å¹´ã¯ãã¹ã«usernameãå«ã¾ãã¦ããã®ã§ã以ä¸ã®ãããªç½®æç¨ã®è¨å®ãå ¥ããããã¦ã¾ããã
[[replace]] regexp = '/user/\w+(/|\s)' replace = '/user/<account_name>$1'
kataribeã¨pt-query-digestãå®è¡ãã¦Discordã«çµæãã¢ãããã¼ãããã¹ã¯ãªãããä½ã£ã¦ããã®ã§ããã³ãã®å¾ã«ãããå®è¡ããã¨ããéç¨ããã¦ãã¾ãã
æè¿ã¯ããããã¨ISUCONåãã«ä¾¿å©ãªãã¼ã«ãããã¿ãããªã®ã§ãããã¤ã試ãã¦ã¿ã¦ããããããªã¨æã£ãããã¦ã¾ãã
èªåããã£ããã¨
主ã«ã¢ã¤ã³ã³å¨ãã¨FillXxxResponseå¨ãã®æ¹åãè¡ãã¾ããã
kataribeãè¦ãã¨ã¢ã¤ã³ã³ã®ã¢ã¯ã»ã¹ã«æéãããã£ã¦ãããã¨ã«æ°ãã¤ããã®ã§ãã¾ãã¯ããããåãæããã¾ããã ã¨ããããDBã«ç»åã®hashãè¨é²ãã¦ãã¢ã¤ã³ã³ã®ã¨ã³ããã¤ã³ã以å¤ã§ã¯ç»åã®ãã¤ããªãåãåºããªãããã«ãã¾ããã
If-None-Matchãè¦ã¦304ãè¿ãé¨åã¯å°ãè¦æ¦ãã¾ããã åãå¤ããããã¼ã«æ¥ã¦ããã¯ããªã®ã«ãªããä¸è´ããªãã¨æã£ã¦æ©ãã§ã¾ããããããã«ã¯ã©ã¼ãã¼ã·ã§ã³ã§å²ã¾ãã仿§ã ã£ããã§ããâ¦ã ãã¨ããã©ã¦ã¶ã§æåã確ããããã¨ãã¦ãåç¾ã§ããªãã£ãã®ã§å°ãæ¸æã£ã¦ã¾ããã
ã¢ã¤ã³ã³ã®ç»åã«ã¤ãã¦ã¯çµå±DBã«å ¥ããã¾ã¾ã«ãã¦ãsingleflightã¨1ç§ã®ã¤ã³ã¡ã¢ãªãã£ãã·ã¥ã§ãã¾ããå½¢ã«ãªãã¾ããã å®éã®ã¨ããnginxã®ãã°ãè¦ãã¨ã»ã¨ãã©304ãè¿ãã¦ããã®ã§ãã©ããã¼ã¨æããªããæ¾ç½®ãã¦ã¾ããã 304ã®å²åãå°ãªãã£ãã追å ã§å¯¾å¿ãèãã¦ããããããã¾ããâ¦ã
ã¢ã¤ã³ã³å¨ãã®å®éã®å¤æ´ã¯ãããªæãã§ãã
FillXxxResponseå¨ãã«ã¤ãã¦ã¯ãã¡ã½ãããæ¨ªæããN+1ãæç´ã«ç´ãã¦ããã®ã¯å¤§å¤ããã ã£ããã¨ã¨ãã¼ã¿ã®æ´æ°ãã»ã¼ãªãã£ããã¨ãããIDã«å¯¾å¿ãããã¼ã¿ã®åå¾ãè¡ãã¤ã¤singleflightã¨60ç§ã®ã¤ã³ã¡ã¢ãªãã£ãã·ã¥ã§å¯¾å¿ãã¾ããã
ã©ããããã¨ãã¨ããã¨ãfunc fetchLivestreamResponseWithCache(livestreamID int64) (*Livestream, error)ãfunc fetchLivestreamResponseWithCache(livestreamID int64) (*Livestream, error)ã¨ããã¡ã½ãããä½ãããã®å
é¨ã§IDã«å¯¾å¿ãããã¼ã¿ã®ãã§ããã¨fillã®å¦çãè¡ã£ã¦ãã¾ãã
ãã ãã¢ã¤ã³ã³ã«ã¤ãã¦ã¯åæ ã¾ã§ã®ç¶äºãå®ãããã¦ãããããã¢ã¤ã³ã³ã®hashã®åå¾ã ãã¯1ç§ã®ã¤ã³ã¡ã¢ãªãã£ãã·ã¥ããå¥éåå¾ãã¦ä¸æ¸ãããå¦çããã¾ããã
kataribeã§ç¢ºèªãã¦é
ãã£ãã¨ã³ããã¤ã³ãããä»ã®FillXxxResponseããå¼ã°ãã¦ããç®æãªã©ã¯ç½®ãæãã¦ããã¾ããããä¸é¨ã¯ãã®ã¾ã¾ã®å¦çã«ãªã£ã¦ã¾ãã
N+1ã«ãªã£ã¦ããé¨åãä¸é¨æ®ããã¾ã¾ã«ãªã£ãã®ã§ãå
¨ä½çã«ç½®ãæãã¦ããã°ããã£ãããã¨ä»æ´ãªããæã£ã¦ã¾ãã
singleflightã¨ã¤ã³ã¡ã¢ãªãã£ãã·ã¥ã®çµã¿åããã¯çµæ§ç°¡åã«ã§ãã¦å¹æã大ããã®ã§ããã¼ã¿ã®æ´æ°ãå°ãªãç®æã§ã¯ç©æ¥µçã«åãå ¥ãã¦ããã¾ããã çµæ§ã³ããå®è£ ãªé¨åãå¤ãã®ã§ãã©ã¤ãã©ãªåãããåçã®æ©è½ãæã£ãã©ã¤ãã©ãªãæ¢ãããã¨ããã§ãâ¦ã
ä»ã®ã¡ã³ãã¼ããã£ããã¨
pgmot
initializeã§DBã®ã¹ãã¼ããé©ç¨ããããã«ãã¦ãããã®ãã¨ã¦ãå©ããã¾ããã ä»ã«ã¯DBã®ã¤ã³ããã¯ã¹å¨ããä¸éã対å¿ãã¦ãããããçµ±è¨æ å ±ã®éãã¯ã¨ãªãåãã¦ããã¾ããã
syusui
NGã¯ã¼ãå¨ãã®æ¹åã¨PowerDNSã®åé¢ããã£ã¦ããã¾ããã å ã pdnsutilã§ãã¡ã¤ã³ã追å ãã¦ããã¨ãããPowerDNSã®REST APIã使ã£ãæ¹æ³ã«å¤ãã¦ãã¦ãããã£ãã§ãã
æçµçãªæ§æ
- isu1: PowerDNS + PowerDNSç¨ã®MySQL + go(PowerDNSã®initializeç¨)
- isu2: nginx + go
- isu3: MySQL(ã¢ããªç¨)
DNSæ°´è²¬ãæ»æã§MySQLã®CPU使ç¨çããã°ãã®ã§PowerDNSã1å°ã«éé¢ããããã¨ãã話ã«ãªã£ã¦ãã®æ§æã«ãªãã¾ããã isu1ã®DNSã§ã¯isu2ã®IPã¢ãã¬ã¹ãæå®ããå½¢ã«ãã¦ãHTTPãªã¯ã¨ã¹ãã¯isu1ã«ç´æ¥é£ã°ãªãããã«ãªã£ã¦ã¾ãã
ã¹ã³ã¢ã䏿°ã«ä¸ãã£ãçç±
PowerDNSã®åé¢èªä½ã«ã¯æåãã¾ãããã使
ãHTTPãªã¯ã¨ã¹ããå
¨ç¶æ¥ãªããªã£ã¦ã¹ã³ã¢ãä¸ãããªãã¨ããç¾è±¡ã«æ©ã¾ããã¦ãã¾ããã
çµäº1æéåããããããã®ç¾è±¡ã®è§£æ±ºæ¹æ³ãå
¨å¡ã§æ¨¡ç´¢ãã¦ãã¦ãçµäº20ååãããã«SetMaxOpenConnsãå°ãªãã®ã§å¢ããã¦ã¿ãã¨ããã䏿°ã«60,788ç¹ã¾ã§ä¸ããã¾ããã
ãã ããã®æç¹ã§ã¯isu2ã«MySQLãåå± ããç¶æ ã§isu3ã使ããã¦ããªãã£ããããæ®ã10åããããããªãã¨ãããsyusuiãããå·éã«isu3ã«MySQLãç§»è¡ãã¦ããã¾ããã isu2ããisu3ã«ãããã¯ã¼ã¯è¶ãã«MySQLãæ¥ç¶ã§ããããã«è¨å®ãã¦ããã®ãã¹ã ã¼ãºã§ãããã£ãã§ãã èªåã¯ãããã¨ããªããªâ¦ã¨æããªããslow query logãåã£ã¦ãªããã¨ãæãåºããã®ã§ãã®å¯¾å¿ããã¦ã¾ããã
ããã¦çµäº2ååã«æå¾ã®ãã³ããã¼ã¯ãã¨ã³ãã¥ã¼ãã¦ããªãã¨ã125,603ç¹ãåºããã¨ãã§ãã¾ããã

ææ³
PowerDNSã®åé¢å¾ã«ãã¾ãã¹ã³ã¢ã伸ã³ãªãã£ããããããªã«ãæéã®ãªã®ãªã¾ã§ãã£ã¦ãããã§ä»ã¾ã§ã§ä¸çªããã©ãã£ãæ°ããã¾ãã ããããã®ãªã®ãªã¾ã§ç²ã£ããã¨ã§12ä½ã«å ¥ããã¨ãã§ãã伿¥è³ãé ããã®ã§ã¨ã¦ãå¬ããã£ãã§ãã
ã©ã³ãã³ã°ãé ãã¦ããä¸çªã¹ã³ã¢ãä¸ãã£ããã¼ã ã«è´ãããã伸ã³ãããããã§è³ããããããã®ã§ã¯â¦ï¼ã¨çµäºæã«æã£ã¦ãã¾ãããããã£ã¨ä¸ã®ãã¼ã ããã¦(ããã1ä½ã®ãã¼ã ãæ´ã«ç¹ã伸ã°ãã¦ãã¦)ããªãã¾ããã§ããâ¦ã
æ¥å¹´ãISUCONãããã°åå ãããã§ããããã¦ä¸ä½ã«å ¥è³ã§ããããã«é å¼µãããã§ãã
