
Rails(puma)ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°
â»ãã®èšäºã¯èªåãæå±ããçµç¹ã§æžãã以äžã®èšäºã®ã³ããŒã§ããæçš¿ããèšäºã¯å人ã®èäœç©ãšããŠèªããã°ã«ã³ããŒããŠè¯ãã«ãŒã«ãšããŠããŸãã
https://tech-blog.mitsucari.com/entry/2025/03/04/224422
ããã«ã¡ã¯ãããã«ãªCTOã®å¡æ¬ããšãã€ãã³ãŒ(@tsukaby0) ã§ãã
ããã«ãªã¯toBåãã®Webã¢ããªã±ãŒã·ã§ã³ã§ãããã®ãããè€æ°ã®ãŠãŒã¶ãŒãåæå©çšããŸããããªã¯ãšã¹ãæ°ã¯toCãµãŒãã¹ãWebåºåãã¡ãã£ã¢ããã®ä»ã®toBåãã¢ããªã±ãŒã·ã§ã³ããã¯éåžžã«å°ãªãã§ãã
ããããä»åããã©ãŒãã³ã¹ããã¥ãŒãã³ã°(ã¬ã€ãã³ã·ããã¯ã¹ã«ãŒãããåªå )ããæ©äŒããããŸããã®ã§ããã®åçµã«ã€ããŠè©±ããŸãã
èæ¯
ããã«ãªã®å©çšè ã¯äž»ã«äŒæ¥ã«åãã人äºæ åœè ãåéšçœ²ã®ãã€ã¬ã€ã€ãŒãçµå¶å±€ãªã©ã§ãããŸããã¢ããªã±ãŒã·ã§ã³é åãšããŠã¯HRã§ãããã®ãããåžžã«å©çšããããããªãµãŒãã¹ã§ã¯ãªããtoCã§ãã£ãããåžžã«äœ¿ãããCRMã®ãããªtoBãµãŒãã¹ãšã¯ç°ãªããHTTPãªã¯ãšã¹ãæ°ã¯éåžžã«å°ãªãã§ãã
ç§ã¯åè·ã¯Webåºåã®ã·ã¹ãã éçºã ã£ãã®ã§ãããŒã¿éããªã¯ãšã¹ãæ°ã¯èšå€§ã§ããããä»ã¯ãã®é ã«æ¯ã¹ããšå€§å¹ ã«å°ãªããŠå°ãç©è¶³ããªãæãããã¯ããŠããŸãã ãã ããããã©ãŒãã³ã¹ã«ã€ããŠå šãç¡é¢å¿ã§è¯ãããã§ã¯ãªããããçšåºŠã¯èããããšããããŸãã
æè¿ãšããéçºã«ããbackendåŽã«APIãè¿œå ãããŸãããããã®APIã¯å€éšãšã®ãªã¯ãšã¹ããå¿
èŠã§ãããé·ãI/O waitãçºçããŸããRuby on Railsã§ã¯WebãµãŒããŒã«pumaããã䜿ãããŸãããããã¯ãã«ãããã»ã¹ãã€ãã«ãã¹ã¬ããã®ã¢ãŒããã¯ãã£ã«ãªã£ãŠããŸããpumaãåæã«åãä»ãããããªã¯ãšã¹ãæ°ã¯ workeræ°(ããã»ã¹æ°) * threadæ°
ã§ãã
ãããã®I/O waitãé·ãAPIã«è€æ°ã®ãªã¯ãšã¹ããåæã«æ¥ãå Žåã¯ãåã¹ã¬ãããå æãããŠããŸããæ°ããæ¥ããªã¯ãšã¹ãã¯åŸ ããããŸããæ°ããæ¥ããªã¯ãšã¹ãã軜ãAPIã ãšããŠãåŸ ããããŠããŸãããšããããšãçºçããŸãã
察ç
åè¿°ã®ãããªç¶æ³ãçºçããå Žåã¯ãµãŒããŒå
šäœã®ã¹ã«ãŒãããã倧å¹
ã«äœäžããŸããã¹ã«ãŒããããšã¯åäœæéåœããã®åŠçèœåã§ãããWebçéã§ã¯å€§æµã¯ req/sec
ã§ããã€ãŸãã¯1ç§ãããã®ãªã¯ãšã¹ãåŠçæ°ã§ãã
åè¿°ã®ãããªéãAPIã ããé »ç¹ã«äœ¿ããããšããããšã¯ããããèµ·ããªãæ³å®ã§ãããpumaã®ã¹ã¬ãããé·ãå æããŠããŸããšããç¶æ³ã¯çºçããŸããããã§ãµãŒããŒå šäœã®ã¹ã«ãŒããããåäžããã察çãæœãããšã«ãªããŸããã
ããã«ãªã§ã¯åè¿°ã®ãããªããžãã¹ã»ã¢ããªã±ãŒã·ã§ã³ç¹æ§ã§ãããããé«ãã¹ã«ãŒãããã¯ä»ãŸã§å¿ èŠãšãããŠããããããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã¯ãããŠããŸããã§ãããä»åã¯pumaã調æŽããŠã¹ã«ãŒããããäžããŸãã
ã€ã³ãã©ãªãœãŒã¹
ããã«ãªã§ã¯ECS Fargateãå©çšããŠããbackendã®Rails docker containerã«ã¯ CPU 2048
ãèšå®ãããŠããŸããããã¯vCPU 2åã§ãã
pumaã®èšå®ã¯ç¹ã«èª¿æŽãããŠããªãã£ããããworkerã¯1ãthreadã¯3ã§ããããã¯èª¿æŽã®äœå°ãå€§å¹ ã«ããããã§ãã
â» workeræ°ã¯æªèšå®ã®å Žåã¯ããã©ã«ãã§ã¯CPUæ°ãšåãæ°ã«ãªããŸãããã ãã WEB_CONCURRENCY
ç°å¢å€æ°ã«èšå®ãããå Žåã¯ããã䜿ãããŸããããã«ãªã§ã¯éå»ã«HerokuããAWSã«ç§»è¡ããŸãããããã®ãšãã«ãã®èšå®ã調æŽãããªãã£ãããã WEB_CONCURRENCY
ã¯ä»ãŸã§1ãèšå®ãããŠãããCPUãªãœãŒã¹ãç¡é§ã«ããŠãããšããç¶æ³ã«ãªã£ãŠããŸãã(ãæ¥ããããªãã)ã
ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®ç¥è
ãŸããã¬ã€ãã³ã·ãšã¹ã«ãŒãããã®çšèªãæå³ã«ã€ããŠç解ããå¿ èŠããããŸãã以äžã®è³æãåèã«ãªããŸãã
https://aws.amazon.com/jp/compare/the-difference-between-throughput-and-latency/
ããã¯Webã¢ããªã±ãŒã·ã§ã³ãšã³ãžãã¢ã«ãšã£ãŠã¯åºç€ã§ããããæ¯éèŠããŸãããã
ç§ã¯æã¯ã¬ã€ãã³ã·ãšã¹ã«ãŒããããããæ··åããŠããŸããŸãããlatencyã¯lateã ããé ãã»é 延ãthroughputã¯throughã ããééæ°ãã¿ãããªæãã§èŠããŸãããã¬ã€ãã³ã·ã¯é«ããäœããã§è¡šããäœã¬ã€ãã³ã·ã§ããã»ããæãŸããã§ããã¹ã«ãŒããããé«ããäœããã§è¡šããŸããé«ã¹ã«ãŒãããã§ããã»ããæãŸããã§ãã
ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãšããèšèã¯ææ§ã§ãããããããå®æœããå Žåã¯é«ã¹ã«ãŒããããç®æãã®ããäœã¬ã€ãã³ã·ãç®æãã®ãããã®ãã©ã³ã¹ãåãã®ãã¯ããèããå¿ èŠããããŸããä»åã®ç§ã®å Žåã¯ã©ã¡ãããšãããšé«ã¹ã«ãŒãããã®æ¯éãé«ãã§ãã
ãŸããRailsããã³pumaã«ãããŠä»¥äžã®è³æãããããã§ãã
https://railsguides.jp/tuning_performance_for_deployment.html
ç¹ã«GILã¯éèŠã§ãã ããã¯MRI(CRuby)ã«ãããŠãRubyã€ã³ã¿ããªã¿å ã§åæã«1ã€ã®ã¹ã¬ããã ããRubyã®ãã€ãã³ãŒããå®è¡ã§ããããšããä»çµã¿ã§ãã䞊åæ§ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ããéã«ã¯å¿ ãç¥ã£ãŠããããããšã§ãã
ããã¯ã€ãŸãã·ã¹ãã ã«ååšããendpointãè² è·å¯Ÿè±¡ã®åŠçã®I/O waitã®å²åãå€ããªãã°ããŸã䞊ååãããããI/O waitãå°ãªããªãã°çµå±ã¯ã»ãšãã©ã®å®è¡(Rubyã³ãŒã)ã¯ã·ãŒã±ã³ã·ã£ã«ã«ãªã£ãŠããŸããšããããšã§ãã
äžèšã®è³æã§ã以äžã®ããã«æžãããŠããŸããã
ãã®ãããã¢ããªã±ãŒã·ã§ã³ãI/Oæäœã«è²»ããæéã50%ãããªãå Žåãããã»ã¹ããšã®ã¹ã¬ããæ°ã2ã3åãè¶ ãããšã¬ã€ãã³ã·ãå€§å¹ ã«æªåããã¹ã«ãŒããããåäžããã¡ãªããããã¡ãŸã¡ç®æžãããŠããŸãå¯èœæ§ããããŸãã
å®éã«ã¯DBããåã«ã·ã³ãã«ãªSQLãçºè¡ããŠããŒã¿ãè¿ãçšåºŠã®åŠçã§ããã°50%ãI/O waitããªãã±ãŒã¹ã¯ãããŸããã€ãŸãã¹ã¬ããæ°ãå¢ãããŠãããŸãæå³ããªãã±ãŒã¹ããããŸããããã«å¯Ÿãã察å¿ãäžèšè³æã«æžããŠãããŸããçŽ æŽããã解説ã§ããã
Rubyã§çã®ãã©ã¬ãªãºã ïŒäžŠååŠçïŒãå®çŸããæ¹æ³ã¯ãè€æ°ã®ããã»ã¹ãå©çšããããšã§ããRubyããã»ã¹ã¯ãCPUã³ã¢ã空ããŠããéããI/Oæäœã®å®äºåŸã«å®è¡ãåéããåã«äºãã«åŸ æ©ããå¿ èŠã¯çããŸããã ãã ããããã»ã¹ã¯ã³ããŒãªã³ã©ã€ããä»ããŠã¡ã¢ãªã®äžéšã®ã¿ãå ±æãããããããã»ã¹ã1åå¢ãããšãã¹ã¬ããã1åå¢ãããããå€ãã®ã¡ã¢ãªãæ¶è²»ãããŸãã
pumaã§ã¯workerãšthreadãããããèšå®ã§ããŸããã€ãŸãåè¿°ã®ãããªç¶æ³ã§ã¯ããã»ã¹ã«çžåœããworkerãå¢ããã°ããããã§ããã
ãã®ä»ã®æ³šæäºé
ãã¥ãŒãã³ã°ãè¡ãåã«ä»ã«ãããã€ãèããŠããããšããããŸãã
- ããããI/OåŸ ã¡ãçºçããå€éšæ¥ç¶ã®éšåãé«éåã§ããªãã
- N+1ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãåŽã®åé¡ãèµ·ããŠããªãã
- ã¬ã€ãã³ã·ãã¹ã«ãŒããããCPUãMemoryãªã©ã¯ãã¬ãŒããªããªã®ã§ãçŸç¶ã©ãã«äœè£ããã£ãŠãäœãåªå ããã®ã
- ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®éçšã§ãµãŒããŒã«è² è·ããããããè² è·ããããåŽã®ãã·ã³ãªãœãŒã¹ã«äœè£ã¯ããããè¶ å€§èŠæš¡ãªè² è·è©Šéšã®å Žåã¯ããããè² è·ããããåŽã«portæ°ãCPU, Thread, éä¿¡è·¯ãªã©ã«å¶éããã1å°ã§ã¯å®çŸã§ããªãå¯èœæ§ãããããšãèæ ®ããå¿ èŠãããã
- è² è·ããããåŽãšãããããåŽã®éä¿¡çµè·¯ã¯ååã«å質ãé«ããããŸãå°ççãäŒéçµè·¯çã«è¿ãããæå³çã«é ãããå®æœããå Žåãé ããèæ ®ã§ããŠããã
- CDNãªã©ã®ãã£ãã·ã¥ãµãŒããŒã¯ååšããŠãããããããèæ ®ããè² è·è©Šéšãªã®ãã©ãã
- 察象ã®ç°å¢ã¯ããŒããã©ã³ã¹ãããŠãããã©ããããŸããªãŒãã¹ã±ãŒã«ã®èšå®ããããã©ããããããã®å¯Ÿè±¡ãµãŒããŒãŸã§ã®éã®èŠçŽ ãè² è·è©Šéšã«äžèŠãªåœ±é¿ãäžããªããã©ããããªãŒãã¹ã±ãŒã«ãäžæçã«åãå¿ èŠãããã
- è² è·ããããã·ããªãªãã©ã®çšåºŠæ¬çªç°å¢ã«è¿ã¥ããã
- è² è·å¯Ÿè±¡ã®åŠçã®I/O waitã¯ã©ã®çšåºŠã
- DBã®connectionã¯è¶³ããŠãããããã®ä»CPUãªã©DBåŽãªãœãŒã¹ãããã«ããã¯ã«ãªã£ãŠããªãã
- ã©ã®ãããªè² è·è©ŠéšããŒã«ãå©çšããã(e.g. wrk, vegeta, JMeter, ab)
- è©Šéšäžã®ãªãœãŒã¹ç£èŠãã©ãããã
- è² è·ãããããšãã«å¯Ÿè±¡ã®ããã»ã¹ãæž©ãŸã£ãŠããèãããã¯ããã®è² è·è©Šéšã®çµæã¯æšãŠã
ä»åã®ããã«ãªã§ã®è² è·è©Šéšã»äºåæºå
ããããæ€èšãŸããããã«ãªç€Ÿã®ç°å¢ãªã©ãéã¿ãŠæé çãèããŸãã
ãŸããå³å¯ãªã·ããªãªæ€èšã¯ã³ã¹ãã倧ããããããåæ¥ã§ãã¥ãŒãã³ã°ãçµãããããã£ãã®ã§ãé©åœãªã·ã³ãã«ãªDBã¢ã¯ã»ã¹ã ãã®Web API(REST)ã察象ãšããŸããã
äºåã«ãã®APIã®I/O waitã調æ»ããŸããããã¯åŒç€Ÿã®å Žåã¯Datadog APMãå ¥ããŠããã®ã§ãã¡ãã§ç¢ºèªã§ããŸãã
40msçšåºŠã®APIã§ãããDBã¢ã¯ã»ã¹(SQL)ã¯2åã§ããããå šäœã®10%ã§ãããã®ä»ã¯çŽ°ããèŠãŠããŸãããRackçã®Middlewareã®åŠçã§ãã£ããControllerã®åŠçã§ãã£ããjson serializeã®åŠçã§ãã£ãããã€ãŸãã¯Rubyã³ãŒã(CPU)ã®åŠçã§ãããã
åºæ¬çã«ã¯ãã®ãããªAPIãå€ãã®ã§ãåŒç€Ÿã®å Žåã¯ã¹ã¬ãããå¢ãããŠãããŸãå¹æã¯ç¡ããšäºæ³ã§ããŸãããã ããåé ã«æžãããšããAPIã«ã€ããŠã¯I/O waitãé·ãããšãåãã£ãŠããã®ã§ããã®å Žåã¯ã¹ã¬ãããå¢ããããšã§å¹æã¯åŸããããã§ãã
ä»åã®å Žå倧èŠæš¡ãªè² è·è©Šéšã§ã¯ãªãã§ããããã£ã¡ãããããšã¯æã£ãŠããªãã®ã§ãè² è·ã«ã€ããŠã¯localã®macbookã§å®è¡ããããšã«ããŸããã
ããŒã«ã«ã€ããŠã¯vegetaãå©çšããããšã«ããŸããã
https://github.com/tsenart/vegeta
瀟å ã§éå»ã«ã€ã³ãã©æ åœè ãå©çšããå®çžŸããããŸããããããªãã«æåãªOSSã§ããããŸããå人çã«ã¯æ®æ®µã¯wrkã䜿ã£ãŠããŠãwrkã®æ¹ãç¥å床ãããã©ãŒãã³ã¹ãäžãªã®ã§ãããç§ã®åã足ããã«BasicèªèšŒãçªç Žããããšãã§ããªãã£ãã®ã§ãä»åã¯äœ¿ããªãããšã«ããŸãããïŒããããèšå®ã§ããã¯ããªã®ã§ããããªãããšã¯ç¡ããšæãã®ã§ããããªããéããªãã»ã»ã»ïŒ
vegetaã¯äžèšã®READMEã«ãæžããŠãããŸãããbrewçã§ã€ã³ã¹ããŒã«ããåŸã§ä»¥äžã®ããã«äœ¿ããŸãã
$ echo "GET https://your_basic_auth_username:your_basic_auth_password@yourdomain/api/v1/foo" | vegeta attack -duration=60s -rate=200 | tee result.bin | vegeta report
BasicèªèšŒãäžèŠãªå Žå㯠your_basic_auth_username:your_basic_auth_password@
ã®éšåã¯åé€ããŸãããŸããå¿
èŠã«å¿ããŠURLãå€ããŠãã ãããdurationã¯è² è·ããããæéã§rateã¯1ç§ãããã®ãªã¯ãšã¹ãæ°ã§ããå€ããããšæããããã«ã¬ã€ãã³ã·ãæªåããã5XXãšã©ãŒã«ãªã£ããããŸããããã®ãããã¯å®è¡æã«äžæã調æŽããå¿
èŠããããŸãã
察象ç°å¢ã¯æ¬çªç°å¢ã«ãªãã¹ãè¿ã¥ããå¿ èŠããããŸããæ¬çªãšç°ãªããã·ã³ãµã€ãºã®ãã®ã§è² è·è©Šéšãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãããŠãæå³ããããŸããã ä»åã®å Žåã¯stgç°å¢ãå©çšããããšãšããŸãããçç±ã¯ä»ã«ç°å¢ãç«ã¡äžããã®ãé¢åã ã£ãã®ãšprdãšåãæ§èœã§ããããã§ãã
æé
æé ã«ã€ããŠã¯ä»¥äžã®æµãã§å®è¡ããããšã«ããŸãã(çµæ§ãã£ãŠãæäžã«çœ ã«ããã£ãã®ã§ãã¯ããããå šéšèããããŠããããã§ã¯ãªãã§ã)ã
- äºåã«AWSãã©ã¡ãŒã¿ã¹ãã¢ã»ç°å¢å€æ°çã§workeræ°ãšthreadæ°ãåçã«å€æŽã§ããããã«ããŠãã
- ECSã®Auto scalingãOFFã«ãã
- ELBã¿ãŒã²ããã°ã«ãŒãã®ãã«ã¹ãã§ãã¯ã®ã¿ã€ã ã¢ãŠãã䌞ã°ã
- çŸç¶ã®èšå®ã§ã¯ã¿ã€ã ã¢ãŠãã¯2ç§ã«ãªã£ãŠãããè² è·ããããŠããæäžã«å¿çãé ããªã£ãŠã¿ã€ã ã¢ãŠãã«ã²ã£ããã£ãŠããŸãããããã«ãã£ãŠå¯Ÿè±¡ã®ã¿ã¹ã¯ãèœãšãããŠã¯èµ·åããŠã»ã»ã»ãšããæãã§æ£ç¢ºãªèšæž¬ã劚ããèŠå ã«ãªã£ãŠããŸãã
- ç°å¢å€æ°ãèšå®ãããECS Serviceã匷å¶ãããã€ã§ã¿ã¹ã¯ãåèµ·åããŠç°å¢å€æ°ãåæ ããworkerãšthreadãå€ãã
- vegetaã§è² è·ãããããååã®ã¹ã³ã¢ã¯æšãŠãŠãïŒåç®ä»¥éããã¹ã«ãŒããããšã¬ã€ãã³ã·ãèšæž¬ãã
- DatadogãCloudwatchã§CPUãšMemoryãèšæž¬ãã
- çµæãèŠãŠç°å¢å€æ°ãå€ããŠåãããšãç¹°ãè¿ããæé©å€ãæ¢ã£ãŠãã
èšæž¬çµæ
ECS Taskã¯1ã€ãšããŸãã
1åç®: worker 1, thread 1, -duration=60s -rate=100
ãŸãã¯æå°ã®ãªãœãŒã¹ã§å®è¡ããŸãã以äžã¯vegetaã®ã¬ããŒãã§ãã
Requests [total, rate, throughput] 6000, 100.02, 20.14
Duration [total, attack, wait] 1m30s, 59.989s, 30s
Latencies [min, mean, 50, 90, 95, 99, max] 18.209ms, 14.255s, 10.018s, 30s, 30.001s, 30.001s, 30.029s
Bytes In [total, mean] 11556540, 1926.09
Bytes Out [total, mean] 0, 0.00
Success [ratio] 30.20%
Status Codes [code:count] 0:1926 200:1812 504:2262
Error Set:
504 Gateway Timeout
(åœç¶ã§ãã)ããã¯é ·ãã§ãããçµæã«ã€ããŠã¯ä»¥äžã®ããã«èªã¿åããŸãã
- rate=100ã§ç§é100ãªã¯ãšã¹ãã®è² è·ããããŠããããå®éã«ã¯throughputã¯
20.14
ããåºãŠããªã - Durationã¯
-duration=60s
ãšãããããæ¬æ¥ã¯60sãšãªãã®ãæ£ããããtotalã¯1m30s
, waitã30s
ãšãªã£ãŠãããã€ãŸãæåŸã«éã£ããªã¯ãšã¹ãã®å¿çã30ç§ãåŸ ããããŠãããããç·åçãªã³ãã³ãå®è¡æéã1m30s
ãšãªã£ãŠãã- â» waitãã©ãããŠ10ã20ã§ã¯ãªã30ãªã®ãã«ã€ããŠã¯CDNã30ç§ã§ã¿ã€ã ã¢ãŠãããèšå®ã«ãªã£ãŠããããã§ã
- Latencyã®minã¯
18.209ms
ã§ããã¯æ©ããã¬ã€ãã³ã·ã¯æå°ãèŠãŠãæå³ããªãã®ã§ãP95ãP99ãèŠãããããš30s
ãªã®ã§å¿çã§ããã«ã¿ã€ã ã¢ãŠãããŠãããšèãããããã¡ãªã¿ã«95ããŒã»ã³ã¿ã€ã«ã¯å šãªã¯ãšã¹ããæ©ãé ã«ãœãŒãããŠäžãã95%ã®äœçœ®ã®ãã®ãšç解ãããšç°¡åã§ããã€ãŸãP95ã30s
ãªã®ã§ãäžäœ5%ã¯30sããé ããšããæå³ã«ãªããŸããP50ã¯10.018s
ãªã®ã§äžäœ50%ã¯10sããé ããšããæå³ã«ãªããŸãã - 2XXç³»ã§æåããŠãããªã¯ãšã¹ãã
30.20%
ãããªã
æµç³ã«1ã¹ã¬ããããç¡ãã®ã«rate 100ã¯å³ããããããã§ãã
CPUãšã¡ã¢ãªããã§ãã¯ããŠãããŸãã
CPUã25%ãã¡ã¢ãªã12%ã§ãŸã ãŸã äœè£ã¯ããããªã¯ãšã¹ããæããŠããªãç¶æ³ã§ããã
2åç®: worker 1, thread 1, -duration=60s -rate=20
ã¹ã«ãŒããã20ã¯åºãŠããã®ã§rate20ã«å€ããŠå®è¡ããŠã¿ãŸãã
Requests [total, rate, throughput] 1200, 20.02, 7.52
Duration [total, attack, wait] 1m30s, 59.949s, 30.001s
Latencies [min, mean, 50, 90, 95, 99, max] 26.97ms, 15.566s, 28.57s, 30.001s, 30.001s, 30.001s, 30.01s
Bytes In [total, mean] 4199988, 3499.99
Bytes Out [total, mean] 0, 0.00
Success [ratio] 56.33%
Status Codes [code:count] 0:524 200:676
Error Set:
æåçã¯å¢ããŸããããŸã ã¬ã€ãã³ã·ãæªãã§ããããŸããã¹ã«ãŒãããããã£ã¡ã20åºãŠããŸããã
3åç®: worker 1, thread 1, -duration=60s -rate=5
Requests [total, rate, throughput] 300, 5.02, 5.01
Duration [total, attack, wait] 59.9s, 59.8s, 100.099ms
Latencies [min, mean, 50, 90, 95, 99, max] 31.165ms, 58.66ms, 50.489ms, 100.943ms, 116.842ms, 160.547ms, 257.552ms
Bytes In [total, mean] 1863900, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:300
Error Set:
ãã£ãšå®å®ããŸãããæåç100%ã§ã¬ã€ãã³ã·ã¯P95㧠116.842ms
ã§ãããæªããªãã§ãããã ããã¹ã«ãŒãããã5ãšããã®ã¯ããŸããããããªãã§ãã
ã©ããã1ã¹ã¬ããã§ã¯ã¹ã«ãŒããã5(rate5)çšåºŠãéçã®ããã§ããã
ãã ãããŸã ãŸã CPUãã¡ã¢ãªããªãœãŒã¹ã«äœè£ã¯ãããŸãã次ããã¯ãªãœãŒã¹ãå¢ãããŠã¿ãŸãã
4åç®: worker 1, thread 2, -duration=60s -rate=10
ä»åºŠã¯ã¹ã¬ããã2ã«å¢ãããŠã¿ãŸããåçŽã«2åãªã®ã§ã¹ã«ãŒãããã¯2åã«ãªããšäºæ³ã§ããŸãããGILã®ããšãèãããšI/O waitãå°ãªãã®ã ããããŸãã¹ã«ãŒãããã¯é«ããªããªããšãæããŸããå®éã¯ã©ãã§ããããã
Requests [total, rate, throughput] 600, 10.02, 10.01
Duration [total, attack, wait] 59.949s, 59.9s, 48.891ms
Latencies [min, mean, 50, 90, 95, 99, max] 21.055ms, 34.137ms, 26.537ms, 48.15ms, 71.876ms, 156.854ms, 541.337ms
Bytes In [total, mean] 3727800, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:600
Error Set:
rate10ã§ãP95ã®ã¬ã€ãã³ã·ã 71.876ms
ãšãªããªãè¯ãã§ãããã¹ã«ãŒããããrateã®éãããã£ãã10åºãŠããŸãã(ããŸãäœã¬ã€ã€ã¯è©³ãããªãã§ããã)åœç¶ãªããI/O waitã¯DBã¢ã¯ã»ã¹ã ãã§ã¯ãããŸãããDB以å€ã®ãããã¯ãŒã¯I/Oããã£ã¹ã¯ã®I/OãI/O waitã§ãããããã®ãé°ã§äžæã䞊ååã§ããŠããããã§ããã
ãªããCPU䜿çšçãã¡ã¢ãªäœ¿çšçãã»ãŒå€ãããŸãããæµç³ã¹ã¬ãããªãã¡ã¢ãªæ¶è²»ãæããããŠè¯ãã§ããã
ãŸããrateã12ã20ã«ããŠãæåçã¯æªåããã®ã§ãã¯ã1ã¹ã¬ããããã5ã¹ã«ãŒãããçšåºŠãšããç¹ã¯å€ãããŸããã
5åç®: worker 1, thread 4, -duration=60s -rate=20
4ã¹ã¬ããã ãšã©ãã§ããããã
Requests [total, rate, throughput] 1200, 20.02, 20.01
Duration [total, attack, wait] 59.982s, 59.95s, 32.027ms
Latencies [min, mean, 50, 90, 95, 99, max] 22.132ms, 37.205ms, 28.579ms, 54.218ms, 96.024ms, 178.459ms, 252.601ms
Bytes In [total, mean] 7455600, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:1200
Error Set:
ãŸã ç·åœ¢ã«ã¹ã±ãŒã«ã§ããŠããŸãããã¹ã«ãŒãããã20åºãŠããŸãããP95ã®ã¬ã€ãã³ã·ã¯ 96.024ms
ã§ãã
å®éã«ã¯1ã¹ã¬ãããããã¹ã«ãŒããã5ã§ã¯ãªãã5.5ã»ã©ã¯ãããããªã®ã§ããã®ããããèæ ®ãããšå°ãæ£ç¢ºãªèšæž¬ã§ã¯ãªãã§ãããäžæŠããã¯ç®ãçã£ãŠæ¬¡ã«è¡ããŸãã
6åç®: worker 1, thread 12, -duration=60s -rate=60
Requests [total, rate, throughput] 3600, 60.02, 56.71
Duration [total, attack, wait] 1m3s, 59.983s, 3.128s
Latencies [min, mean, 50, 90, 95, 99, max] 29.244ms, 1.644s, 149.128ms, 838.605ms, 13.539s, 29.307s, 30.001s
Bytes In [total, mean] 22236327, 6176.76
Bytes Out [total, mean] 0, 0.00
Success [ratio] 99.42%
Status Codes [code:count] 0:21 200:3579
Error Set:
ç·åœ¢ã«ã¹ã±ãŒã«ããªããªããŸãããæåçã100%ã§ã¯ãªãã§ãããP95ã®ã¬ã€ãã³ã·ã 13.539s
ãšããªãé
·ãã§ãã
æµç³ã«12ã¹ã¬ããããããšGILã«ãã£ãŠRubyã®ãã€ãã³ãŒãã®ã·ãŒã±ã³ã·ã£ã«å®è¡ãå¢ããŠé ããªã£ãã®ã§ãããã
CPUãšã¡ã¢ãªã«ã€ããŠãèŠãŠã¿ãŸãããã
CPUã䜿çšçãäžé100%ã«åŒµãä»ããŠããŸããvCPUã¯2ã€ããã®ã§ãæ倧ã¯200%ãŸã§åºãŸãããworkerã¯1ã€(1 process)ãªã®ã§ã100%ãé床ã®ããã§ããã ã¡ã¢ãªã«ã€ããŠã¯12ã¹ã¬ãããŸã§å¢ãããŠãå šç¶å¢ããŠããŸãããã¹ã¬ããã®ãããã§ããã
7åç®: worker 1, thread 8, -duration=60s -rate=40
äžæŠ8ã¹ã¬ãããŸã§äžããŠã¿ãŸãã
Requests [total, rate, throughput] 2400, 40.02, 40.00
Duration [total, attack, wait] 1m0s, 59.975s, 31.29ms
Latencies [min, mean, 50, 90, 95, 99, max] 26.202ms, 174.883ms, 32.537ms, 108.147ms, 210.727ms, 4.936s, 7.338s
Bytes In [total, mean] 14911200, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:2400
Error Set:
12ã¹ã¬ããããã¯è¯ãã§ããã¹ã«ãŒãããã¯rateãšåã40åºãŠããŸãããã¬ã€ãã³ã·ã¯P95㧠210.727ms
ã§ããé
ããšããã°é
ãã§ããããã ãP99ã¯4ç§è¶
ããªã®ã§æ²æšãªç¶æ³ã§ããã
ã©ãããã¹ã¬ãããšããŠã¯å€ããšã8çšåºŠãè¯ãããã§ãã
ã§ã¯æ¬¡ã«CPUãååã«äœ¿ã£ãŠããããã£ãããªãã®ã§ãworkerãå¢ãããŸãã
8åç®: worker 2, thread 8, -duration=60s -rate=80
åçŽã«ç©ºããŠããCPUã1ã€äœ¿ããã®ã§ã¹ã«ãŒãããã¯2åã¯åºããã§ãã
Requests [total, rate, throughput] 4800, 80.02, 79.98
Duration [total, attack, wait] 1m0s, 59.987s, 26.868ms
Latencies [min, mean, 50, 90, 95, 99, max] 18.223ms, 27.829ms, 24.28ms, 32.18ms, 43.1ms, 111.211ms, 302.851ms
Bytes In [total, mean] 29822400, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:4800
Error Set:
äºæ³éã2åã®80åºãŠããŸãããã¬ã€ãã³ã·ãP95㧠43.1ms
ãªã®ã§ãšãŠãè¯ãã§ãã
ããã§å床CPUãšã¡ã¢ãªãèŠãŠã¿ãŸãã
ã¡ã¢ãªã¯ã¹ã¬ãããå¢ãããããå¢ããŠããŸããã1workerã®ãšãã¯ãããã13%ã ã£ãã®ãã2workerã§26%çšåºŠãŸã§å¢ããŸãããã¡ã¢ãªã¯4GBãªã®ã§1workerããã520MBãããã¯äœ¿ãããã§ãã(ãã¡ããåŠçã®äžã§ã©ã®çšåºŠã¡ã¢ãªã䜿ããã«ããã)ãã¡ã¢ãªé¢ã§ã¯threadãããã ãã¶äžå©ã§ããããããthreadã®æ¹ã§é æã¡ã«ãªã£ãŠããã¹ã«ãŒããããæŽã«å¢ããããšãã§ããŸããã
CPUã¯80%ã»ã©ã§ãããã³ã³ããã«å ¥ã£ãŠtopã§ã詳ããèŠãŠã¿ãŸãã
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
60 root 20 0 1002852 343192 14708 S 67.0 2.1 2:36.44 ruby
54 root 20 0 997052 339352 14644 S 9.0 2.1 2:36.31 ruby
7 root 20 0 943708 322332 30024 S 1.0 2.0 0:16.69 ruby
PID 7ã¯puma clusterã®masterã§ããããå¥ãšããŠãPID 54, 60ãworkerã§ãããã°ãã芳枬ããŠã¿ãŸããããçæ¹ããCPU䜿çšçãé«ããããŸãããCPUã¯ãŸã ãŸã äœè£ãããããã§ããã€ãŸãã¹ã«ãŒãããã¯ãŸã äžãããããã§ããã
9åç®: worker 2, thread 8, -duration=60s -rate=120
worker, threadã¯å¢ãããã«rateã120(1.5å)ã«å¢ãããŸãããããæãåããã§ããããã
Requests [total, rate, throughput] 7200, 120.02, 119.66
Duration [total, attack, wait] 1m0s, 59.992s, 177.894ms
Latencies [min, mean, 50, 90, 95, 99, max] 18.337ms, 59.373ms, 33.59ms, 127.55ms, 173.146ms, 320.585ms, 829.559ms
Bytes In [total, mean] 44733600, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:7200
Error Set:
è¯ãæãã§ãããã®ç¶æ ã§CPUã¯120%ã»ã©ã§ãããŸã ããããã§ãã
10åç®: worker 2, thread 8, -duration=60s -rate=200
Requests [total, rate, throughput] 12000, 200.02, 118.84
Duration [total, attack, wait] 1m19s, 59.995s, 18.952s
Latencies [min, mean, 50, 90, 95, 99, max] 22.144ms, 7.422s, 139.376ms, 27.058s, 30s, 30.001s, 30.019s
Bytes In [total, mean] 58499718, 4874.98
Bytes Out [total, mean] 0, 0.00
Success [ratio] 78.18%
Status Codes [code:count] 0:1032 200:9382 504:1586
Error Set:
ã ãã§ãããã¹ã«ãŒãããã¯rate200ã«å¯ŸããŠ120çšåºŠããåºãŠããŸããããP95ã®ã¬ã€ãã³ã·ã¯ 30s
ã§ããããã¯å³ããã
CPU䜿çšçã¯170%çšåºŠã§ãã
ããã§ãã¥ãŒãã³ã°ãçµããŠãããããã®ãµãŒããŒã®ã¹ã«ãŒãããã¯120ãšçµè«ä»ããŠãè¯ãã®ã§ãããããå°ãè©ŠããŠã¿ãŸãã
11åç®: worker 3, thread 8, -duration=60s -rate=180
workerã1ã€å¢ãããŸããworker2ã€ã§ã¹ã«ãŒããã120ãªã®ã§ã1.5åã®rate180ã¯æãåããã§ããããïŒãšã¯ããvCPUã¯2ã€ã§ãã
Requests [total, rate, throughput] 10800, 180.02, 126.64
Duration [total, attack, wait] 1m13s, 59.994s, 13.022s
Latencies [min, mean, 50, 90, 95, 99, max] 29.381ms, 6.675s, 186.03ms, 26.9s, 30s, 30.001s, 30.011s
Bytes In [total, mean] 57548895, 5328.60
Bytes Out [total, mean] 0, 0.00
Success [ratio] 85.62%
Status Codes [code:count] 0:816 200:9247 504:737
Error Set:
ã ãã§ãããã¹ã«ãŒãããã¯å¢ããŠããŸããããã¬ã€ãã³ã·ãé ·ãã§ãã CPU䜿çšçã¯180%ã»ã©ã§ããã¡ã¢ãªã¯30%ã»ã©ã§ãããã¯ãworkerãå¢ãããšå¢ããŸããã
2ååã®rate120ã§ã¯ã©ããªã®ã§ããããã
12åç®: worker 3, thread 8, -duration=60s -rate=120
Requests [total, rate, throughput] 7200, 120.02, 119.95
Duration [total, attack, wait] 1m0s, 59.991s, 32.194ms
Latencies [min, mean, 50, 90, 95, 99, max] 25.598ms, 59.969ms, 47.218ms, 92.397ms, 127.889ms, 276.961ms, 720.998ms
Bytes In [total, mean] 44733600, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:7200
Error Set:
誀差ã®ç¯å²ãšãèšãããã§ããã2workerããã¯ã¬ã€ãã³ã·ãæ¹åããŠããŸããvCPUã2ã«å¯ŸããŠ3worker(3process)ãªã®ã§ããã®åã³ã³ããã¹ãã¹ã€ãããçºçããŠã¬ã€ãã³ã·ã¯æªåããããªãã®ã§ãããã©ãããŠãããªã£ããã¯è©³ããèå¯ã§ããŠããŸããã
ãã ããäœåºŠã枬ããšä»¥äžã®ãããªã¹ã³ã¢ãåºãŸãã
Requests [total, rate, throughput] 7200, 120.02, 119.93
Duration [total, attack, wait] 1m0s, 59.992s, 44.781ms
Latencies [min, mean, 50, 90, 95, 99, max] 26.197ms, 352.23ms, 56.311ms, 167.694ms, 372.768ms, 11.355s, 14.252s
Bytes In [total, mean] 44733600, 6213.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:7200
Error Set:
P99ãé ·ãã§ãããããããã¯GCã§ã¹ãããã¶ã»ã¯ãŒã«ãããŠããã®ã§ãããã
çµè«
9åç®ã®
worker 2, thread 8,
-duration=60s -rate=120
ãã®èšå®ãè¯ãããã§ããworkeræ°ã¯ç¡é£ã«vCPUãšæãã€ã€ãthreadæ°ã¯8çšåºŠã«ãããš1ã€ã³ã¹ã¿ã³ã¹ã§ 120req/sec
çšåºŠã®ã¹ã«ãŒãããã確ä¿ã§ããããšãåãããŸãããworkeræ°ãå°ãªãã®ã§ã¡ã¢ãªãã ãã¶äœè£ããããŸãã
ãŸã 調æŽã®äœå°ã¯ããã§ãããããworker, threadã®èšå®ä»¥å€ã®èª¿æŽãäœãã§ãããããããŸãããæ¬çªç°å¢ã§ã¯ãã£ãšå€æ§ãªãªã¯ãšã¹ãã»åŠçãçºçããã®ã§ããã®ç¶æ³ãèãããšæé©ã§ãªãèšå®ãšããå¯èœæ§ãäžå®ããããŸãããã ããã以äžæéããããããªãã®ã§ãäžæŠã¯ãã®èšå®ã§ãã£ãŠã¿ãããšã«ããŸããã
æ¬çªç°å¢é©çšåŸã®ããã©ãŒãã³ã¹
以äžã¯ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãªãªãŒã¹ååŸã®äžéšã®ã¡ããªã¯ã¹ã§ãã Fri 21
ãå°ãéãããããã§ãªãªãŒã¹ããŠããŸãã
ã¡ã¢ãªäœ¿çšçã19%ãã32%ã»ã©ã«å¢ããŠããŸãããããã¯workerã1ãã2ã«å€ããããã§ããã
P95ã¬ã€ãã³ã·ã«é¢ããŠã¯è¥å¹²ã®æ¹åãããããã§ããããã¯ä»ãŸã§ã¯ãªã¯ãšã¹ããåãä»ããããã¹ã¬ããæ°ã足ããŠããªãã£ããããããŒã¯æãªã©ã¯äžéšã®åŠçãå€å°åŸ ããããŠããã®ãããããŸããããä»åã®å¯Ÿå¿ã§æ¹åããã®ãããããŸãããããããã°ããèšæž¬ããŠã¿ãªããšãªããšãèšããªãéšåã¯ããããã§ãã
ã¹ã«ãŒãããã«ã€ããŠã¯ãããããå¢ããã¯ãã§ããããããprdç°å¢ã«æ¥ããªã¯ãšã¹ããããã»ã©å€ããªããããå®éã«ã©ã®ãããªå€åããã£ãã®ãã¯èšæž¬ã§ããŠããªãã§ãã
æ¬çªç°å¢é©çšåŸã®ããã©ãŒãã³ã¹(ãã®2)
ãªãªãŒã¹åŸãã°ããçµéããã®ã§å床ããã©ãŒãã³ã¹æž¬å®ã®çµæãèŠãŠã¿ãŸããã
ãªãªãŒã¹ãã21æ¥ä»¥éP95ã®ã¬ã€ãã³ã·ãæ¹åããŠããããã«èŠããŸããããŸã ãŸã ããŒã¯æé垯ã¯ã¬ã€ãã³ã·ã®æªåãèŠãããŸããã
ä»åã¯ã¹ã«ãŒãããç®çã®èª¿æŽã§ããããã¬ã€ãã³ã·é¢ã§ãæ¹åãèŠãããŠè¯ãã£ãã§ãã
ä»åã®è² è·è©Šéšã§ã¯I/O waitãé·ãAPIã察象ãšããŠããªãã®ã§ããã¡ãã察象ãšããå Žåã¯ãã£ãšã¹ã¬ãããå¢ãããã»ããããã©ãŒãã³ã¹ã¯ã§ããã§ãããã®ãããã®ãªã¢ã«ãªãªã¯ãšã¹ãç¶æ³ã«å¿ããããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã¯ããé£æ床ãé«ãã®ã§æ¬¡åã®èª²é¡ã«ããããšæããŸããåœé¢ã®éã¯ä»å€ã®èšå®ã§ä¹ãåãããã§ãã
çŸåšãããã«ãªã§ã¯ITãšã³ãžãã¢ãåéããŠããŸããèå³ã®ããæ¹ã¯ãã²ãæ°è»œã«ãé£çµ¡ãã ããïŒ