èªåã§èŠããã£ãã
ãã®èšäºã«ã³ã¡ã³ããæžãããã£ãã®ã§ãããæ°ãå€ãã£ãŠãã£ãšæžããŸããã ãã®èšäºã®èè ã¯ãèå³æ·±ããããã¯ãããããšãããããŸããã
ã€ã³ã¿ãŒãããäžã§èª°ããééã£ãŠããŸãã ç§ãã¡ã®æŽè¡ïŒ ã¯ããããã¯æ®å¿µã§ãã ç§ã¯èªåèªèº«ã§ããã€ãã®çµè«ãåºããŸãããããããã¯ç§ã®äž»èŠ³çãªæ°å€ã§ãã äžè¬çã«èããã¹ãããš-ç§ã¯ç¥ããŸãããã³ã¡ã³ãã«ããªãã®æèŠãæžããŠãã ããã
UPD 3è°è«ã«åºã¥ããŠãæåããæžãå¿ èŠãããããšãããããŸãããã€ãŸãããã¹ãã代衚çãªãã®ã§ã¯ãªããããã瀺ãå¯äžã®ããšã¯ãç§ã®éåžžã«åŒ±ããã·ã³ã§ã¯ããŒãããã¹ãŠã®ååã®é åºã§Nginxã«é ããããšã§ãã Nodeã¯ãNginxã®ããã«ãã»ãšãã©äœãããŸããããã®æå³ã§ã¯ããããã¯ãçãããã§ãã ã¿ã¹ã¯ã»ãããããããšãç¹å®ã®æ¡ä»¶äžã§ããŒããããŒã»ã³ããéè² è·ã«ããªãããšããã¹ããä¿¡ããå¿ èŠããªãããšã瀺ãããã£ãã®ã§ãã
ã«ããã®äžã«GITãžã®ãªã³ã¯ããããŸãã ç§ã ãã«æé©ãªèšå®ãããã€ããããŸãã ãã®èšäºã¯æ··oticãšããŠããã倧éšåãã³ããã¯ã§ãã ã©ããã人éçãªèãæ¹ãžã®é£æ³çãªèšåã®çµ¶ããå€åããæèã§èªåã®èããè¡šçŸããèŠç¥ãã¬äººã®æ°ããã³ãããŒã¯ãå¥åŠãªçµè«ã«çããæ±ãæºåãã§ããŠããªããªããèªãã§ã¯ãããŸããã
UPD 1ã¯ã ããŠãŒã¢ã¢ããšããŠå°ãã¿ã°ä»ããããŠããŸããmã ããæ£ç¢ºã«ãªããŸãã
UPD 2ã¯äžèšãä¿¡ããŸããïŒ
ç§ã¯ã·ã£ãŒãã³ã§ãïŒ éãã«ã¿ã³ããªã³ãæã«åãã ããŒããæããã«ã......
ç§ã¯ãªãœãŒã¹ã奜ãã§ã¯ãããŸããããªããªã ç·æ¥ã®å Žåãç§ã¯ããããæã£ãŠããªãããšãç解ããŠããŸãã
ãã®ããã AMD C-60 / 4 Gb / SSDïŒåœŒãã¯ç§ã«å¯ŸããŠéåžžã«æ§ããã§ãã
ãããã¯ãã¹ãŠãããããã¯ã«åããããŠãããééã¯çŽ1ããã°ã©ã ã§ãLinux Mintã«ãã£ãŠå¶åŸ¡ãããŠããŸãã ç§ã¯è³ªåãäºèŠããã®ã§ãããã«çããŸãã ã¯ããããŸããŸæçãããŸãã Matroskinã®ãããªã¯ãã¹ã¹ããããã§ããŸãã ãšã«ãŽã£ã¹ã®ããã«ã®ã¿ãŒã§æããŸãã ããã®å®¶ã§ã¯ããã³ãã§éãæã€ããšãã§ããŸãã äžè¬çã«-家æãžã®èŽãç©ïŒå¹ åºããããã£ãŒã«ã®ããããã®ãªãå°é家ã
ãããŠãç§ã¯JavaScriptã§ã®ããã°ã©ãã³ã°ã奜ãã§ãã ããããPythonãRubyãPHPãPerlãVBãCïŒãJavaãªã©ãèªãããšãã§ããŸãã ãããããéã¯åãã€ããªãããšã¯æžããŸããã ãããŠãç§ã¯å°éçãªITæè²ãåããŠããªãã®ã§ãå ±éã®ããžãã¯ã䜿çšããŸãããŸããæ¬è³ªçã«ãç§ã¯æã ä»äººã®é ã§ã¯ãªãèªåã®é ã§èããããšã奜ã¿ãŸãã ã ããç§ã¯äœãã§ããŸãã
ã客æ§ã¯ãNode.JSãšNginxã®çé¢æ¯èŒåæã®ã¿ã¹ã¯ãç§ã«äžããŠãããŸããã ãªããªã ããŒãèªäœã®æœåšçãªããã©ãŒãã³ã¹ã枬å®ããå¿ èŠããã£ããããã¿ã¹ã¯ãå·§åŠã«èšå®ããŸããã
-NGINXã¯ãããã©ã«ãã®éçããŒãžindex.htmlã®ã¿ãæäŸããŸãã
-NodeãµãŒããŒã¯æ¥ç¶ã®æ°ãä¿æããåå¿çã§çµæãçæããæ倧æ°ãèæ ®ããå¿ èŠããããŸãã
-ã¯ã©ã€ã¢ã³ããœãããŠã§ã¢ã¯ã1ç§ãããã®åŠçæžã¿ãªã¯ãšã¹ãã®æ°ãã€ãŸã ã¹ããŒã¿ã¹ã200 OKã§æ£åžžã«å®äºããŸããã
nginxãåã€ããšã¯æããã§ãã ãããããã€ã³ãã¯ããã§ã¯ãªããæ¯èŒã§ãã ã€ãŸã ããŒãã€ã³ã¿ãŒããªã¿ãŒãNginxéçãããæ£ç¢ºã«æªãåæ°ã
ãã¡ãããããŒãã«staticãäžããããšãå¯èœã§ããããšãç解ããŠããŸãã ããããããªãã¯nginxã®ããžãã¹ããžãã¯ã2ã3æéã§12åã®ããŒãã«ã«æããããšããŠããŸããïŒ
GITãžã®ãªã³ã¯ã¯æåŸã«ãªããŸãã ãã¿ã³ã¯å ãã«ãã人ã®ããã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
ç§ã¯ãããã°ãç念ãææããããã«ãã©ããã£ãŠããã«æ¥ãã®ããå°ãã話ãããŸãã
ç§ãã¡ã¯çãææ°ã®ããã»ããµãé£ç¶ããŠåäœããããšãç¥ã£ãŠããŸãã
ç§ãã¡ã¯ãã¹ãŠãç¥ã£ãŠããŸãããããã§ã¯ç§ãã¡ãæãæ¹æ³ãç解ããŠããŸãããããã§ã¯ãããŸããïŒ
æããŠãã ãããããªãã¯äžåºŠã«ããã€ãã®ããšãèããããšãã§ããŸããïŒ ãããŠããã®ç¬éã«é»è©±ã鳎ããé»è©±ã«åºãå¿ èŠãããå Žåã¯ã©ããªããŸããïŒ ãããŠãé»è©±ãšäžŠè¡ããŠãååãããªãã«è¿ã¥ããããªããåæ ããããã€ãã®éåžžã«éèŠãªè³ªåããããšãããã©ãã§ããããïŒ åæã«ãBOSSã®äººããŸã éãéãããšãLurkãå±éããããã©ãŠã¶ãŠã£ã³ããŠã§èŠãã³ããããŠããç»é¢ãèŠãããäœããã£ãšé¢çœããã®ãèŠããããŸããïŒ
å²ã蟌ã¿ãšã¹ã¿ãã¯ãªãŒããŒãããŒã®åŠçãåãã§ãã
ããã¯æãããã§ããã-éåææ§ã¯ãããšäœã®é¢ä¿ãããã®ã§ããããïŒ
ããããçªç¶ãäœããã®ã²ã©ãçç±ã§æåŸãŸã§ç解ã§ããªãã£ãå Žåã¯ãããäžåºŠèãçŽãããšããå§ãããŸãã
ããšãã°ã8ã€ã®ã³ã¢ã³ã¢ãšåæ§ã«ãè³ã¯æ倧8ã€ã®æäœã¿ã¹ã¯ãä¿æã§ããŸãã æ®ã-圌ãã¯ããã«ã©ããã«ãããŸããäžåºŠããã§ãããã圌ãã¯ãŸã é ãã§ãã
ãããæ³åããæ¹æ³ãèªåã§èããŠã ã¢ã€ã³ã·ã¥ã¿ã€ã³ã®ãªãã«ã® chtolããã¬ã€ããŠãã ããã ããæå³ã§ãé ã®äžã«ä¿æããããã ãã«ãã¹ãŠã®ãã«ãã¹ã¬ããããããŸãïŒL1-L2ãã£ãã·ã¥ã®ããã«ïŒãããã§ã-ãªãŒãã¬ãããªãïŒMemïŒïŒ
ã«ãŠã³ãããŸãããã
ããŒãã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãããããæšæºã³ãŒããåŸãããŸã ãããããããããã§ã ã
var cluster = require('cluster'); var numCPUs = require('os').cpus().length; ... for (var i = 0; i < numCPUs; i++) { cluster.fork(); ...
ãŸãã¯ããã«ãã¹ã¬ããã䜿çšããåæ§ã®ãã®ã
誰ããããŒãå¶åŸ¡ãããšæããŸããïŒ
æ£ãã-ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã
ãããŠãã·ã¹ãã ã§ã¯ã誰ãããããå¶åŸ¡ããŸããïŒ
ããã§ã-Linux Kernel \ Windows Core-ããŒããŠã§ã¢ã¢ãã¹ãã©ã¯ã·ã§ã³ã¬ã€ã€ãŒïŒhal.dllãããããééã£ãŠãããããããŸããïŒã
ãããŸã§ã®ãšãããããã»ã©çããããã®ã¯ãªãããã§ãã
ããããããå°ãèããŠã¿ãŸãããïŒ
ããŒããé€ããŠããã以äžäœã確ç«ãããŠããªããšããŸãã
ãã以å€ã«ãã®ããŒããŠã§ã¢ã«ã¯ä»ã«äœããããŸããïŒ
æ£ãã-ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã
ãããŠãæµããæ¯é ããã®ã¯ãã®ãã¹ãŠã§ãã éåæã¢ãŒãã§ãã£ãŠããã·ãŒã±ã³ã·ã£ã«åœä»€ã®ãããªåçŽãªãã®ããã«ãŒãã«ã®äžçã§ã®ãã«ãã¹ã¬ããã䞊åã¿ã¹ã¯ã®ãããªè€éãªãã®ã«ãã£ãŠç¶æãããæœè±¡åãããããšã¯äžæè°ã«æããŸãããïŒ
ãã®ãããããã»ããµã®åéå¿ã¯é çªã«ã«ãŠã³ããããŸãã ãããã®äžã«ã¯ã«ãŒãã«ã®å®è¡å¯èœã³ãŒãããããŸãããã®ã¿ã€ãã¯ããã¹ãŠã䞊åãã«ãã¿ã¹ã¯ãªã©ãšããŠæ瀺ããããšããŸãã å éšã§ã¯ãOSã«ãŒãã«ã®å¶åŸ¡äžã§ãããŒãããã»ã¹ã®ã·ã³ã°ã«ã¹ã¬ããã³ãŒããå転ããŸãããã®ãã¡ãCPUã³ã¢ã®æ°ã«å¿ããŠ8ã€ã®ããŒã¹ããããŸãã
ãIOãããããã¯ãŒã¯ã¹ã¿ãã¯ãããšãã°HTTPçµç±ã§ã«ãŒãã«ã«å ¥ããšãããªããŒã¯ã©ããªããŸããïŒ OSã«ãŒãã«ã察åŠããŠããéã«...
ãŸããããŒãã8ã€ã®ã³ã¢ãã¹ãŠã®ãã¹ãŠããã§ã«ç Žæ£ããŠããå Žåã¯ã©ããªããŸããïŒ OSã«ãŒãã«ã察åŠããŠããããã§ãã...
ããããããã§ç§ã¯ãã§ã«ãã³ãããŒã¯ãèŠãããšæããŸãïŒ
ãããŸãããïŒ
- äžèšã®ã¿ã¹ã¯ã§èª¬æãããŠããããã«ãããŒããšNginxãæ¯èŒããŸãã
- å®å šãªCPUè² è·ãããå Žåãšãªãå Žåã®ããŒãã®å¿çæ§ãæ¯èŒããŸãã
ã³ãŒãããµãŒãã£ã³ãªã©ã®éåžžã®ã¿ã¹ã¯ãè¡ããªããããã¹ãŠã®ãã¹ãã10åéã²ãããŸããã
ã¯ããLinuxã®ç¹å®ã®ã«ãŒãã«ã§ã®ã¿ããã»ã¹ãæ©èœãããããã«ãã¿ã¹ã¯ã»ããããããŸãã
ããŒãã§ã¯ã次ã®ããã«äœ¿çšããŸãã
var PID = process.pid; exec('taskset -pc ' + affinity + ' ' + PID);
request.jsãä»ããŠããŒãäžã§ã¯ãšãªãœãããŠã§ã¢ãäœæããŸãããhttp.agent.maxSocketsãå¿ããªãããšã¯éèŠã§ããã ãã¡ãããCURLã¯å¯èœã§ãããããã¹ãŠãèªåã§èšç®ãããã£ãã®ã§ãã
ãããã£ãŠãæåã®ãã¹ãïŒNginxããã³Nodeäžã®ãµãŒããŒãæ倧10,000件ã®ãªãŒãã³ãªã¯ãšã¹ãã çŸå®ã«ã¯ããã¡ãããçµæã¯å°ãªããªããŸããã ãã®æ°åã¯ããªã¯ãšã¹ãã®é åå ã®ãªã¯ãšã¹ãã®æ°ã§ããã1ç§ãããã®å®éã®å€ã§ã¯ãããŸããã ããã«ã¯ãšãªãå®è¡ã§ããŸãããããã©ãŒãã³ã¹ã§ã¯ãªããéãã枬å®ããŸããã
ç§ã®ããŒããŠã§ã¢ã§ã¯ãããŒãã¯1ç§ããã1200ãè¶ ããå¿çã«èããŸããã ãããŠnginxã¯çŽ3500ã«èããŸããã
ãã®ãããªãŽãã¯èª°ãã®ææšã§ã¯ãªãããšãç解ããŠããŸãã ããããã¯ã©ã¹ã¿ãŒã®ãªãããŒããµãŒããŒããŒãã³ã¢ã§å転ããæåã®ãµãŒããŒã§èŠæ±ãåŠçããŠããããšãèãããšãéåžžã«åäžãªã€ã³ãžã±ãŒã¿ãŒããããŸãã
ã€ãŸã éãã¯æ¡éãã§ã¯ãªãããšãã©ãã§ãïŒ
èå³æ·±ãããšã«ãæåã®ãªã¿ãŒã³ãåŸã ã«å¢å ãããšãæçµçãªæ°å€ã¯å®å®ããŸãã çŽ3ååŸã
2çªç®ã®ãã¹ãã¯ããŒãèªäœã«å¯Ÿãããã®ã§ããïŒ
ã¢ãŒã | ãRPS | ãPWait | ãã¡ã | |
1ã | ããŒããµãŒããŒãšã¯ãšãªãœãããŠã§ã¢ãã¢ãã£ããã£ããŸã£ããåä¿¡ããªãã£ããšãã | 1400 | 6.5 | 95M |
2ã | nginxã䜿çšãããã¹ãããã®ã¢ãã£ããã£ãåãããµãŒããŒãšã¯ãšãªã | ã1200-1300 | ã5.2 | 8,500äž |
3ã | ã¢ãã£ããã£ãåãããµãŒããŒããªã¯ãšã¹ããªãã | 1100 | ã5.5 | 1å |
4ã | ã¢ãã£ããã£ã®ãªããµãŒããŒãããã䌎ããªã¯ãšã¹ãã | 1200 | ã6ã | 90M |
æ°å€ã®ãã¹ãŠã®æž¬å®ã¯ããã¹ãŠãå®å®ãã3åéã®æäœåŸã«èŠèŠçã«è¡ãããŸããã
èå³æ·±ãããšã«ãæåã¯ããŒããã¡ã¢ãªãéäžçã«ãæ¶è²»ããããã®åŸå°ãèœã¡ãŠãã©ãããã³ã¬ã¯ã¿ãŒãåäœããŠããããã§ãã
ãRPS -1ç§ãããã®ãªã¯ãšã¹ãæ°ã
ãPWaitã¯ãå®éã®ãã©ãŠã¶ã§ã®ããããã®ããŒãžã¿ã€ã ã¢ãŠãã§ãã å®è¡äžã®æ°å€ã確èªãã以å€ã«äœããè¡ããšãã®ã·ã¹ãã è² è·ã®éæ¥çãªã€ã³ãžã±ãŒã¿ã
htopãä»ããŠã¡ã¢ãªãèŠããŸããã
ããŒã-ã€ãŸãããã¹ãŠãçµ±èšèª€å·®ã®éçã«ãããã®ããã§ãã
ããŒãã«å ããŠãããŒã¿ããŒã¹ãredisãHaProxyãããã³Nginxãããããšãæ³åããŠãã ããã
+ããžãã¹ããžãã¯ã¯æ¬ç©ã§ãããæ°åã®å ç®åšã§ã¯ãããŸããã
ã¹ãªããã¯èª°ã§ããïŒ
ç§ã®èª¿æ»çµæïŒ
0. Node-ãã§ã«ã€ã³ã¿ãŒããªã¿ãŒãšããŠéåžžã«åªããŠããŸãã
- å¯èœã§ããã°ãã·ã¹ãã èªäœã«1ã€ã®ã³ã¢ãæ®ããŸãã
- ã·ã¹ãã ã«ä»ã®äœãããããããå¿ èŠãããå Žåã¯ãã·ã¹ãã ã«ããã«ã³ã¢ãæ®ããŸãã
- æ®ãã¯ã100ïŒ ã®äœ¿çšçã§ããŒããµãŒããŒã«æäŸã§ããŸãã
ãã¹ãã§GIT ã
çŽæã®ãŠãŒã¹ã±ãŒã¹ïŒ
- 誰ããç¥ããªãå ŽåãäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ã¯npm installãšããŠè¡ãããŸãã
- äœãå€æŽããªãå Žåã ããŒãtest_requester.jsã®åŸã«EnterããŒã1åæŒããŠã¯ãšãªãéå§ããå¿ èŠããããŸãã
- Ctrl + Cã§åæ¢ããŸãã
- ããã¯ãã¹ãŠã³ã³ãœãŒã«ã«ãããŸãã Offtopic-ç§ã¯Guake Terminalã䜿çšããŠããŸã-ç§èŠïŒéåžžã«äŸ¿å©ã§ãã
- ãµãŒããŒã¯ããŒãtest_httpserver.jsãšããŠèµ·åããŸãã
ã¯ãããŸããéã®ã¬ãã«ã§ã·ã¹ãã ã®ã¢ãŒããã¯ãã£ãç解ããŠããªãå Žåã¯ããã¹ããå®è¡ããªãã§ãã ããã ç解ãããå Žåã¯ãããã¥ã¢ã«ãåžã£ãŠãã ãããäŸïŒC. Petzold-ãã³ãŒãã ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ç§å¯ã®èšèªããã¹ãŠã®æ å ±ã¯ãéåžžã«ã¢ã¯ã»ã¹ããããèšèªã§è©³ãã説æãããŠããŸãã ç§ã®ç¥ç¶ã¯ãããèªãã§ããç¥ç¶ã¯75æ³ã§ããã圌ã¯å é±å€«ã§ãã
念ã®ããã4ã€ã®ã³ã¢ãããããã®ãã¡2ã€ãæ¬ç©ã§ããå ŽåãnumCPUsã¯å®¹èµŠãªãåãã€ãããšãã§ãããšèª¬æããŸãã
ã¯ããèå³ã®ããå Žåã¯ç§ã®èšå®ïŒ
cat /etc/sysctl.conf
fs.file-max = 65535
kernel.max_lock_depth = 4096
fs.mqueue.queues_max = 1024
fs.mqueue.msg_max = 2048
fs.mqueue.msgsize_max = 16384
fs.inotify.max_user_watches = 1048576
fs.inotify.max_queued_events = 65536
fs.inotify.max_user_instances = 16384
net.ipv4.tcp_fin_timeout = 150
kernel.sem = 1000 32000 128 2048
kernel.max_lock_depth = 4096
fs.mqueue.queues_max = 1024
fs.mqueue.msg_max = 2048
fs.mqueue.msgsize_max = 16384
fs.inotify.max_user_watches = 1048576
fs.inotify.max_queued_events = 65536
fs.inotify.max_user_instances = 16384
net.ipv4.tcp_fin_timeout = 150
kernel.sem = 1000 32000 128 2048
cat /etc/security/limits.conf
ã«ãŒãããŒãmsgqueue 131072
ã«ãŒããœããmsgqueue 131072
ã«ãŒãããŒãsigpending 131072
ã«ãŒããœããsigpending 131072
ã«ãŒãããŒãnproc 131072
ã«ãŒããœããnproc 131072
ã«ãŒãããŒãã³ã¢131072
ã«ãŒããœããã³ã¢131072
ã«ãŒãããŒãnofile 131072
ã«ãŒããœããnofile 131072
*ããŒãmsgqueue 131072
*ãœããmsgqueue 131072
*ããŒãsigpending 131072
*ãœããsigpending 131072
*ããŒãnproc 131072
*ãœããnproc 131072
*ããŒãã³ã¢131072
*ãœããã³ã¢131072
*ããŒãnofile 131072
*ãœããnofile 131072
ã«ãŒããœããmsgqueue 131072
ã«ãŒãããŒãsigpending 131072
ã«ãŒããœããsigpending 131072
ã«ãŒãããŒãnproc 131072
ã«ãŒããœããnproc 131072
ã«ãŒãããŒãã³ã¢131072
ã«ãŒããœããã³ã¢131072
ã«ãŒãããŒãnofile 131072
ã«ãŒããœããnofile 131072
*ããŒãmsgqueue 131072
*ãœããmsgqueue 131072
*ããŒãsigpending 131072
*ãœããsigpending 131072
*ããŒãnproc 131072
*ãœããnproc 131072
*ããŒãã³ã¢131072
*ãœããã³ã¢131072
*ããŒãnofile 131072
*ãœããnofile 131072
ãããã®èšå®ãªãã§ç¢ºèªãããšããã30ïŒ æ¹åãããŸããã
...