7ã€ã®C / C ++ã©ã€ãã©ãªã䜿çšããŠæ§ç¯ãããHTTPãµãŒããŒã³ã¢ã®ããã©ãŒãã³ã¹ãšãïŒæè²ç®çã§ïŒãã®åéã®ä»ã®æ¢è£œãœãªã¥ãŒã·ã§ã³ïŒnginxããã³node.jsïŒã®ããã©ãŒãã³ã¹ãæ¯èŒããŸããã
HTTPãµãŒããŒã¯ãè€éã§èå³æ·±ãã¡ã«ããºã ã§ãã ã³ã³ãã€ã©ãŒãäœæããªãã£ãããã°ã©ããŒã¯æªããšããæèŠããããŸãããã³ã³ãã€ã©ãŒãããHTTPãµãŒããŒãã«çœ®ãæããŸããããã¯ããŒãµãŒã§ããããããã¯ãŒã¯ã§åäœãããã«ãã¹ã¬ãããšéåæã§åäœããŸãã
ãã¹ãŠã®å¯èœãªãã©ã¡ãŒã¿ãŒïŒéçãåçãããŸããŸãªæå·åã¢ãžã¥ãŒã«ããããã·ãªã©ãè¿ãïŒã®ãã¹ãã¯ã1ãæ以äžã®éªšã®æããäœæ¥ã®ã¿ã¹ã¯ã§ãããããã¿ã¹ã¯ã¯ç°¡çŽ åãããŸããã³ã¢ã®ããã©ãŒãã³ã¹ãæ¯èŒããŸãã HTTPãµãŒããŒã®ã³ã¢ïŒãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãªã©ïŒã¯ããœã±ããã€ãã³ããããŒãžã£ãŒãšããããåŠçããããã®äž»èŠãªã¡ã«ããºã ïŒã¹ã¬ãããããã»ã¹ãªã©ã®ããŒã«ãšããŠå®è£ ïŒã§ãã ããã«ã¯ãHTTPãã±ããããŒãµãŒãšå¿çãžã§ãã¬ãŒã¿ãŒãå«ãŸããŸãã äžèŠãããšããã¹ãŠãéåæã€ãã³ãïŒselectãepollãªã©ïŒããããã®ã¡ã¿ã©ãããŒïŒlibevãboost.asioãªã©ïŒããã³OSã«ãŒãã«ãåŠçããããã®ç¹å®ã®ã·ã¹ãã ã¡ã«ããºã ã®æ©èœããã¹ãããããšã«ãªããŸãããç¹å®ã®å®è£ ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ãšããŠã¯ãããã©ãŒãã³ã¹ã«å€§ããªéãããããŸãã
HTTPãµãŒããŒã®ããŒãžã§ã³ãlibevã«å®è£ ããŸãã ã ãã¡ãããæªåé«ãrfc2616ã®èŠä»¶ã®å°ããªãµãã»ããã®ãµããŒããå®è£ ãããŠããŸã ïŒå°ãªããšã1ã€ã®HTTPãµãŒããŒããããå®å šã«å®è£ ããŠãããšã¯èããããŸããïŒããã®ãã¹ãã®åå è ã®èŠä»¶ãæºããããã«å¿ èŠãªæå°éã®ã¿ã
- 8000çªç®ã®ããŒãã§ãªã¯ãšã¹ãããªãã¹ã³ããŸãã
- ãã§ãã¯æ¹æ³ïŒGETïŒ;
- ãªã¯ãšã¹ãã®ãã¹ïŒ/åçïŒã確èªããŠãã ããã
- çãã«ã¯ä»¥äžãå«ããå¿
èŠããããŸãã
HTTP / 1.1 200 OK ãµãŒããŒïŒãã³ã æ¥ç¶ïŒããŒãã¢ã©ã€ã ã³ã³ãã³ãã¿ã€ãïŒããã¹ã/ãã¬ãŒã³ ã³ã³ãã³ãã®é·ãïŒ2 42
- ä»ã®æ¹æ³\ãã¹-ãšã©ãŒã³ãŒã404ïŒããŒãžãèŠã€ãããŸããïŒã§å¿çãè¿ãããŸãã
ã芧ã®ãšãããæ¡åŒµåãªãããã£ã¹ã¯äžã®ãã¡ã€ã«ã¢ã¯ã»ã¹ãã²ãŒããŠã§ã€ã€ã³ã¿ãŒãã§ã€ã¹ãªã©ã -ãã¹ãŠãæ倧éã«ç°¡çŽ åãããŸãã
ãµãŒããŒãããŒãã¢ã©ã€ãæ¥ç¶ããµããŒãããŠããªãå ŽåïŒã¡ãªã¿ã«ãcpp-netlibã®ã¿ãããã«ãã£ãŠåºå¥ãããŸããïŒããããããã¹ããå®è¡ãããŸããã ã¢ãŒãã
èæ¯
æåã¯ã1æ¥ãããäœåãã®ãããã®è² è·ãæã€HTTPãµãŒããŒãå®è£ ããããšãã¿ã¹ã¯ã§ããã ãªã¯ãšã¹ãã®90ïŒ ãçæãã顧客ã®æ°ã¯æ¯èŒçå°ãªããæ®ãã®10ïŒ ãçæãã顧客ã®æ°ã¯å€ããšæ³å®ãããŠããŸããã å¿çãåéããŠçµæãã¯ã©ã€ã¢ã³ãã«è¿ãããã«ãåèŠæ±ãããã«ä»ã®è€æ°ã®ãµãŒããŒã«éä¿¡ããå¿ èŠããããŸãã ãããžã§ã¯ãã®å šäœçãªæåã¯ãå¿çã®é床ãšå質ã«äŸåããŠããŸããã ãããã£ãŠãæåã«å©çšå¯èœãªæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããšã¯ããŸã£ããäžå¯èœã§ããã 次ã®è³ªåã«å¯ŸããåçãåŸãå¿ èŠããããŸããã
- èªè»¢è»ãåçºæããããæ¢åã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããã䟡å€ã¯ãããŸããïŒ
- node.jsã¯è² è·ã®é«ããããžã§ã¯ãã«é©ããŠããŸããïŒ
ãããããªããC ++ã³ãŒãã®èã¿ãæšãŠã30è¡ã§ãã¹ãŠãJSã«æžãæããŸãã
ããšãã°ãHTTPããŒãã¢ã©ã€ãã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããŸããïŒ ïŒ1幎åŸãçãã¯ããã«è¡šæãããŸãã -ããã¯åœ±é¿ãåãŒããéåžžã«éèŠã§ãïŒã
ãã¡ãããæåã«ç§ã®èªè»¢è»ãçºæããã次ã«node.jsãç»å ŽãïŒ2幎åã«ãã®ããšãç¥ããŸããïŒãç¥ããããšæããŸããïŒæ¢åã®ãœãªã¥ãŒã·ã§ã³ã¯ããªãã®ãã®ãããã©ãã ãå¹ççã§ãç¡é§ãªæéã§ãããïŒ å®éããã®æçš¿ãç»å ŽããŸããã
æºåãã
é
- ããã»ããµãŒïŒCPUïŒAMD FXïŒtmïŒ-8120 Eight-Core Processor
- ãããã¯ãŒã¯ïŒlocalhostïŒçç±-TODOãåç §ïŒ
ãœãããŠã§ã¢
- OSïŒFreeBSD 9.1-RELEASE-p7
ãã¥ãŒãã³ã°
éåžžããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã®è² è·ãã¹ãã§ã¯ã次ã®æšæºèšå®ã»ãããå€æŽããã®ãäžè¬çã§ãã
/etc/sysctl.conf
kern.ipc.somaxconn = 65535
net.inet.tcp.blackhole = 2
net.inet.udp.blackhole = 1
net.inet.ip.portrange.randomized = 0
net.inet.ip.portrange.first = 1024
net.inet.ip.portrange.last = 65535
net.inet.icmp.icmplim = 1000
net.inet.tcp.blackhole = 2
net.inet.udp.blackhole = 1
net.inet.ip.portrange.randomized = 0
net.inet.ip.portrange.first = 1024
net.inet.ip.portrange.last = 65535
net.inet.icmp.icmplim = 1000
/boot/loader.conf
kern.ipc.semmni = 256
kern.ipc.semmns = 512
kern.ipc.semmnu = 256
kern.ipc.maxsockets = 999999
kern.ipc.nmbclusters = 65535
kern.ipc.somaxconn = 65535
kern.maxfiles = 999999
kern.maxfilesperproc = 999999
kern.maxvnodes = 999999
net.inet.tcp.fast_finwait2_recycle = 1
kern.ipc.semmns = 512
kern.ipc.semmnu = 256
kern.ipc.maxsockets = 999999
kern.ipc.nmbclusters = 65535
kern.ipc.somaxconn = 65535
kern.maxfiles = 999999
kern.maxfilesperproc = 999999
kern.maxvnodes = 999999
net.inet.tcp.fast_finwait2_recycle = 1
ããããç§ã®ãã¹ãã§ã¯ãããã©ãŒãã³ã¹ã®åäžã«ã¯ã€ãªãããŸããã§ããããå Žåã«ãã£ãŠã¯å€§å¹ ãªé床äœäžã«ã€ãªãããŸããããã®ãããæçµãã¹ãã§ã¯ã·ã¹ãã ã®èšå®ïŒã€ãŸãããã¹ãŠã®ããã©ã«ãèšå®ãGENERICã«ãŒãã«ïŒã«å€æŽã¯å ããããŸããã§ããã
äŒå¡
å³æžé€š
å | ããŒãžã§ã³ | ã€ãã³ã | ããŒãã¢ã©ã€ããµããŒã | ã¡ã«ããºã |
---|---|---|---|---|
cpp-netlib | 0.10.1 | Boost.asio | ãã | ãã«ãã¹ã¬ãã |
æäœã | 11/11/30 | ãªãã | ã¯ã | ãã«ãããã»ã¹ïŒããã»ã¹ããšã«1ã€ã®ã¹ã¬ããïŒãéåæ |
libevent | 2.0.21 | libevent | ã¯ã | ã·ã³ã°ã«ã¹ã¬ãã*ãéåæ |
ãã³ã°ãŒã¹ | 5.0 | éžæãã | ã¯ã | ã·ã³ã°ã«ã¹ã¬ãããéåæããªã¹ãããïŒè©³çŽ°ïŒ |
ããŸãã | 0.5 | ãªãã | ã¯ã | ãã«ãã¹ã¬ãã |
Pionãããã¯ãŒã¯ã©ã€ãã©ãª | 0.5.4 | Boost.asio | ã¯ã | ãã«ãã¹ã¬ãã |
POCO C ++ã©ã€ãã©ãª | 1.4.3 | éžæãã | ã¯ã | ãã«ãã¹ã¬ããïŒçä¿¡æ¥ç¶çšã®åå¥ã®ã¹ã¬ããïŒããã¥ãŒä»ãïŒè©³çŽ°ïŒ |
æ¢è£œã®ãœãªã¥ãŒã·ã§ã³
å | ããŒãžã§ã³ | ã€ãã³ã | ããŒãã¢ã©ã€ããµããŒã | ã¡ã«ããºã |
---|---|---|---|---|
Node.js | 10/10/17 | libuv | ã¯ã | ã¯ã©ã¹ã¿ã¢ãžã¥ãŒã«ïŒãã«ãããã»ãã·ã³ã°ïŒ |
nginx | 1.4.4 | epollãselectãkqueue | ã¯ã | ãã«ãããã»ãã·ã³ã° |
*ããã«ãããã»ã¹-1ããã»ã¹1ã¹ã¬ãããã¹ããŒã ã«åŸã£ãŠããçŽããããã¹ãã®å Žå
å€±æ Œ
å | çç± |
---|---|
nxweb | Linuxã®ã¿ |
g-wan | Linuxã®ã¿ïŒããã³äžè¬çã«... ïŒ |
libmicrohttpd | äžå®ã®è² è·ãããã |
å©åã | ã³ã³ãã€ã«ãšã©ãŒ |
ã㌠| ã³ã³ãã€ã«ãšã©ãŒ |
libhttpd | åæãHTTP / 1.0ãããããŒã®å€æŽã¯èš±å¯ãããŸãã |
ãªãã | ã³ã³ãã€ã«ãšã©ãŒãã¯ã©ãã·ã¥ |
ã¯ã©ã€ã¢ã³ããšããŠãlighttpd- weighttpdã®éçºè ããã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŸããã å ã ã¯ãããæè»ãªããŒã«ãšããŠhttperfã䜿çšããäºå®ã§ããããåžžã«ã¯ã©ãã·ã¥ããŸãã ããã«ãweighttpdã¯libevã«åºã¥ããŠããŸããããã¯ãselectã䜿çšããhttperfãããFreeBSDã«ãšã£ãŠã¯ããã«åªããŠããŸãã ã¡ã€ã³ãã¹ãã¹ã¯ãªããïŒãªãœãŒã¹æ¶è²»ã®èšç®ãªã©ã䌎ãweighttpdã®ã©ãããŒïŒãšããŠãFreeBSDçšã«åäœæãããgwan-ovsky ab.cãæ€èšããŸãããããã®åŸPythonïŒã¢ããªã±ãŒã·ã§ã³ã®bench.pyââïŒã§ãŒãããæžãçŽãããŸããã
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯åãç©çãã·ã³ã§å®è¡ãããŠããŸããã
次ã®å€ãå€æ°å€ãšããŠäœ¿çšãããŸããã
- ãµãŒããŒã¹ã¬ããã®æ°ïŒ1ã2ãããã³3ïŒ
- åæã«éããŠãã顧客ãªã¯ãšã¹ãã®æ°ïŒ10ã100ã200ã400ã800ïŒ
åæ§æã§ã¯ã20ã30åã®å埩ãå®è¡ãããå埩ããã200äžã®ãªã¯ãšã¹ããè¡ãããŸããã
çµæ
èšäºã®æåã®ããŒãžã§ã³ã§ã¯ã VBartãšå€åºäžã®ãŠãŒã¶ãŒã«ããã³ã¡ã³ãã«ç€ºãããŠããããã«ããã¹ãæ¹æ³ã§é倧ãªéåãè¡ãããŸããã ãã®ãããç¹ã«ãããã»ããµã³ã¢ã«ããã¿ã¹ã¯ã®å³å¯ãªåé¢ã¯äœ¿çšãããããµãŒããŒ\ã¯ã©ã€ã¢ã³ãã¹ã¬ããã®åèšæ°ã蚱容åºæºãè¶ ããŸããã ãŸãã枬å®çµæã«åœ±é¿ãããªãã·ã§ã³ïŒAMD Turbo CoreïŒã¯ç¡å¹åãããŠãããã枬å®ãšã©ãŒã¯ç€ºãããŠããŸããã èšäºã®çŸåšã®ããŒãžã§ã³ã§ã¯ã ããã§èª¬æããã¢ãããŒãã䜿çšããŠããŸã ã
ã·ã³ã°ã«ã¹ã¬ããã¢ãŒãã§å®è¡ãããŠãããµãŒããŒã®å Žåã次ã®çµæãåŸãããŸããïŒãµãŒããŒ/ã¯ã©ã€ã¢ã³ãã¹ããªãŒã ã®çµã¿åããã®æ倧äžå€®å€ãååŸãããŸããïŒã
å Žæ | å | ã¯ã©ã€ã¢ã³ã æµã | ããŒã»ã³ã æé | ãåãåãã | ||
---|---|---|---|---|---|---|
ã«ã¹ã¿ã | ã·ã¹ãã ã | æåïŒç§ïŒ | 倱æïŒïŒ ïŒ | |||
1 | nginx | 400 | 10 | 10 | 101210 | 0 |
2 | ãã³ã°ãŒã¹ | 200 | 12 | 15 | 53255 | 0 |
3 | libevent | 200 | 16 | 33 | 39882 | 0 |
4 | æäœã | 100 | 20 | 32 | 38550 | 0 |
5 | ããŸãã | 10 | 22 | 33 | 29230 | 0 |
6 | ãã³ | 10 | 25 | 50 | 20943 | 0 |
7 | ãã€äžéå | 10 | 24 | 83 | 16526 | 0 |
8 | node.js | 10 | 23 | 173 | 9374 | 0 |
9 | cpp-netlib | 10 | 100 | 183 | 5362 | 0 |
ã¹ã±ãŒã©ããªãã£ïŒ
çè«çã«ã¯ãã³ã¢ããã£ãšããã°ãçç£æ§ã®çŽç·çãªå¢å ã芳å¯ãããŸãã æ®å¿µãªãããçè«ãæ€èšŒããããšã¯ã§ããŸãã-ååãªæ žããããŸããã
ççŽã«èšã£ãŠãnginxã¯ç§ãé©ãããŸãã-çµå±ã®ãšãããæ¬è³ªçã«ã¯æ¢è£œã®å€æ©èœã¢ãžã¥ãŒã«åŒãœãªã¥ãŒã·ã§ã³ã§ãããçµæã¯é«åºŠã«å°éåãããã©ã€ãã©ãªãããæ¡éãã«åªããŠããŸãã å°æ¬ã
mongooseã¯ãŸã 湿ã£ãŠããŠãããŒãžã§ã³5.0ã¯å®è¡ãããŠãããããã©ã³ãã¯ã¢ã¯ãã£ããªéçºæ®µéã«ãããŸãã
cpp-netlibã¯ææªã®çµæã瀺ããŸããã HTTPããŒãã¢ã©ã€ãæ¥ç¶ããµããŒãããªãã£ãã®ã¯ããã ãã§ãªããããŒã¹ãã®ã©ããã§ã¯ã©ãã·ã¥ããã ãã§ãªãããã¹ãŠã®å埩ãé£ç¶ããŠå®è¡ããããšãåé¡ã§ããã ééããªãã解決çã¯ç²éã§ãããããã¥ã¡ã³ãã¯å€ããªã£ãŠããŸãã æ³çæåŸã®å Žæã
node.jsã¯ãã§ã«ããã§scãããŠããã®ã§ãç§ã¯ããã»ã©ã«ããŽãªãŒçã§ã¯ãããŸããããV8ã¯ãŸã èŠç¶ããŠããŸãã ãã€ããŒãããªããŠããªãœãŒã¹ãéåžžã«ç±å¿ã«æ¶è²»ãããã¹ãåå è ã®çç£æ§ã®10ã20ïŒ ãæäŸãããã®é«è² è·ãœãªã¥ãŒã·ã§ã³ãšã¯äœã§ããïŒ
HTTPããŒãã¢ã©ã€ãã®ãªã³/ãªãïŒ ãã¹ãã§å·®ãx2åã«éããå Žåãç§ã®ãã¹ãã§ã¯å·®ã¯x10ãŸã§ã§ããã
ããã¹ã¿ããã«ãã粟床ïŒ95.0ïŒ ã®ä¿¡é ŒåºŠã§å·®ã¯èšŒæãããŠããŸããã
è€å
- ãç°ãªããã·ã³äžã®ã¯ã©ã€ã¢ã³ããšãµãŒããŒãã¢ãŒãã§ã®ãã³ãããŒã¯ã ããªãã¯æ³šæããå¿ èŠããããŸã-ãã¹ãŠããããã¯ãŒã¯è ºã«é¥ãããããã¯ãŒã¯ã«ãŒãã®ã¢ãã«ã ãã§ãªããã¹ã€ãããã«ãŒã¿ãŒãªã©ã«ãåºãããå¯èœæ§ããããŸãã -å®ãã·ã³éã®ã€ã³ãã©ã¹ãã©ã¯ãã£å šäœã æå§ãã«ãçŽæ¥æ¥ç¶ãè©Šãããšãã§ããŸãã
- ã¯ã©ã€ã¢ã³ãHTTP APIã®ãã¹ãïŒãµãŒããŒããã³ãããã·ãšããŠç·šæïŒã åé¡ã¯ããã¹ãŠã®ã©ã€ãã©ãªãHTTPã¯ã©ã€ã¢ã³ããå®è£ ããããã®APIãæäŸããŠããããã§ã¯ãªãããšã§ãã äžæ¹ã人æ°ã®ããã©ã€ãã©ãªïŒlibcurlãªã©ïŒã«ã¯ãã¯ã©ã€ã¢ã³ãåŽã®APIã»ããã®ã¿ãçšæãããŠããŸãã
- ä»ã®HTTPã¯ã©ã€ã¢ã³ãã®äœ¿çšã httperfã¯äžèšã®çç±ã§äœ¿çšãããŠããŸãããab-å€ãã®ã¬ãã¥ãŒã¯æ代é ãã§ãããå®éã®è² è·ãä¿æããŠããŸããã å€ãã®äººãæšå¥šããŠããŸãã ããã€ãã®ãœãªã¥ãŒã·ã§ã³ãããã€ã玹ä»ããŸããããã®ãã¡ã®ããã€ããæ¯èŒããå¿ èŠããããŸãã
- Linuxç°å¢ã§ã®åæ§ã®ãã³ãããŒã¯ã ããã¯èå³æ·±ããããã¯ã«ãªããŸãïŒå°ãªããšããããªããŒã®è°è«ã®æ°ããæ³¢ïŒã
- å€æ°ã®ã³ã¢ãæèŒããäžäœã®Intel Xeonã§ãã¹ããå®è¡ããŸãã
åç §è³æ
httperfãsiegeãapacheãã³ãããŒã¯ãpronkã®ã¹ãã¬ã¹ãã¹ã -ãµãŒããŒã®è² è·ãã¹ãçšã®HTTPã¯ã©ã€ã¢ã³ãã
Httperfã䜿çšããããã©ãŒãã³ã¹ãã¹ã -ãã³ãããŒã¯ã®ãã³ããšã³ã ã
ApacheBenchãšHTTPerf -G-WANã®ãã³ãããŒã¯ããã»ã¹ã®èª¬æã
ã¯ãŒãã¯å¥ã®é«è² è·ã®èŠæ HTTPãµãŒããŒãHaskellã§ãã
ã¢ããª
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ãŠã®ãã¹ãã®å埩ã®ãœãŒã¹ãšçµæãããã³HTTPãµãŒããŒã®ã¢ã»ã³ããªãšã€ã³ã¹ããŒã«ã«é¢ãã詳现æ å ±ã確èªã§ããŸãã