
ç§ã¯Odnoklassnikiãã©ãããã©ãŒã ã®ããŒã ã§åããŠããã仿¥ã¯é³æ¥œé
ä¿¡ãµãŒãã¹ã®ã¢ãŒããã¯ãã£ãèšèšãå®è£
ã®è©³çްã«ã€ããŠã話ããŸãã
ãã®èšäºã¯ã Joker 2018ã§ã®ã¬ããŒãã®è»¢åã§ãã
ããã€ãã®çµ±èš
ãŸããOKã«ã€ããŠå°ã説æããŸãã ããã¯ã7000äžäººä»¥äžã®ãŠãŒã¶ãŒã䜿çšããŠãã巚倧ãªãµãŒãã¹ã§ãã 4ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ãã7åå°ã®è»ããµãŒãã¹ãæäŸããŠããŸãã æè¿ãå€ãã®CDNãµã€ããèæ
®ããã«2 Tb / sã§ãã©ãã£ãã¯ããŒã¯ãçªç ŽããŸããã ããŒããŠã§ã¢ãæå€§éã«æŽ»çšããŸããæãè² è·ã®é«ããµãŒãã¹ã¯ãã¯ã¢ããã³ã¢ããŒãããã®1ç§ãããæå€§100,000ã®ãªã¯ãšã¹ããåŠçããŸãã ããã«ãã»ãšãã©ãã¹ãŠã®ãµãŒãã¹ã¯Javaã§èšè¿°ãããŠããŸãã
OKã«ã¯å€ãã®ã»ã¯ã·ã§ã³ããããæã人æ°ã®ããã»ã¯ã·ã§ã³ã®1ã€ã¯ã鳿¥œãã§ãã ãã®äžã§ããŠãŒã¶ãŒã¯ãã©ãã¯ãã¢ããããŒãããç°ãªãå質ã®é³æ¥œã賌å
¥ããã³ããŠã³ããŒãã§ããŸãã ãã®ã»ã¯ã·ã§ã³ã«ã¯ãçŽ æŽãããã«ã¿ãã°ãæšå¥šã·ã¹ãã ãã©ãžãªãªã©ããããŸãã ãããããµãŒãã¹ã®äž»ãªç®çã¯ãã¡ãã鳿¥œãæŒå¥ããããšã§ãã
鳿¥œé
ä¿¡äŒç€Ÿã¯ããŠãŒã¶ãŒãã¬ãŒã€ãŒãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿ã転éãã責任ããããŸãã musicd.mycdn.meãã¡ã€ã³ãžã®ãªã¯ãšã¹ããèŠããšãWebã€ã³ã¹ãã¯ã¿ãŒã§ãã£ããã§ããŸãã ãã£ã¹ããªãã¥ãŒã¿ãŒAPIã¯éåžžã«åçŽã§ãã
GET
HTTPèŠæ±ã«å¿çããèŠæ±ããããã©ãã¯ç¯å²ãçºè¡ããŸãã

ããŒã¯æã«ã¯ã50äžã®æ¥ç¶ã§è² è·ã100 Gb / sã«éããŸãã å®éã鳿¥œãã£ã¹ããªãã¥ãŒã¿ãŒã¯å
éšãã©ãã¯ãªããžããªã®åã«ãããã£ãã·ã¥ããã³ããšã³ãã§ããã
One Blob Storageãš
One Cold Storageã«åºã¥ããŠããããã¿ãã€ãã®ããŒã¿ãå«ãŸããŠããŸãã
ãã£ãã·ã³ã°ã«ã€ããŠèª¬æããã®ã§ãåççµ±èšãèŠãŠã¿ãŸãããã çºé³ãããTOPã衚瀺ãããŸãã

çŽ140ãã©ãã¯ã1æ¥ã®ãã¹ãŠã®åçã®10ïŒ
ãã«ããŒããŠããŸãã ãã£ãã·ã³ã°ãµãŒããŒã«å°ãªããšã90ïŒ
ã®ãã£ãã·ã¥ããããæããããå Žåã¯ã50äžãã©ãã¯ãå
¥ããå¿
èŠããããŸãã 95ïŒ
-ã»ãŒ100äžãã©ãã¯ã
ãã£ã¹ããªãã¥ãŒã¿ãŒã®èŠä»¶
ãã£ã¹ããªãã¥ãŒã¿ãŒã®æ¬¡ã®ããŒãžã§ã³ãéçºãããšããã©ã®ãããªç®æšãèšå®ããŸãããïŒ
1ã€ã®ããŒãã§10äžã®æ¥ç¶ãä¿æã§ããããã«ãããã£ãã®ã§ãã ãããŠããããã¯é
ãã¯ã©ã€ã¢ã³ãæ¥ç¶ã§ãïŒããŸããŸãªé床ã®ãããã¯ãŒã¯äžã®ãã©ãŠã¶ãšã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®æã åæã«ããµãŒãã¹ã¯ããã¹ãŠã®ã·ã¹ãã ãšåæ§ã«ãã¹ã±ãŒã©ãã«ã§ãã©ãŒã«ããã¬ã©ã³ãã§ãªããã°ãªããŸããã
ãŸãããµãŒãã¹ã®äººæ°ã®é«ãŸãã«å¯Ÿå¿ããããå€ãã®ãã©ãã£ãã¯ãæäŸã§ããããã«ããããã«ãã¯ã©ã¹ã¿ãŒã®åž¯åå¹
ãæ¡å€§ããå¿
èŠããããŸãã ãŸãããã£ãã·ã¥ããããšãã©ãã¯ã®ã¹ãã¬ãŒãžã«åé¡ããããªã¯ãšã¹ãã®å²åãçŽæ¥äŸåãããããã¯ã©ã¹ã¿ãŒãã£ãã·ã¥ã®åèšå®¹éãã¹ã±ãŒãªã³ã°ã§ããå¿
èŠããããŸãã
仿¥ã§ã¯ã忣ã·ã¹ãã ãæ°Žå¹³ã«æ¡åŒµã§ãããã€ãŸããã·ã³ãšããŒã¿ã»ã³ã¿ãŒã远å ã§ããããšãå¿
èŠã§ãã ããããåçŽã¹ã±ãŒãªã³ã°ãå®è£
ããããšèããŸããã å
žåçãªææ°ã®ãµãŒããŒã«ã¯ã56åã®ã³ã¢ã0.5ã1 TBã®RAMã10ãŸãã¯40 Gbã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã1ããŒã¹ã®SSDãã£ã¹ã¯ãå«ãŸããŠããŸãã
æ°Žå¹³æ¹åã®ã¹ã±ãŒã©ããªãã£ã«ã€ããŠèšãã°ãè峿·±ã广ãçããŸããæ°åã®ãµãŒããŒãšæ°äžã®ãã£ã¹ã¯ãããå Žåãäœããçµ¶ããå£ããŸãã ãã£ã¹ã¯éå®³ã¯æ¥åžžçãªãã®ã§ãããé±ã«20ã30åãã€å€æŽããŸãã ãŸãããµãŒããŒã®æ
éã¯èª°ãé©ããã1æ¥2ã3å°ã®è»ã亀æãããŸãã ãŸããããŒã¿ã»ã³ã¿ãŒã®é害ã«ã察åŠããå¿
èŠããããŸãããããšãã°ã2018幎ã«ã¯3ã€ã®é害ããããŸããããããã¯ããããæåŸã§ã¯ãããŸããã
ãªãç§ã¯ãããã¹ãŠã§ããïŒ ã·ã¹ãã ãèšèšãããšããé
ããæ©ããå£ããŠããŸãããšãç¥ã£ãŠããŸãã ãããã£ãŠããã¹ãŠã®ã·ã¹ãã ã³ã³ããŒãã³ãã®é害ã·ããªãªãåžžã«
æ
éã«èª¿æ»ããŸãã é害ã«å¯ŸåŠããäž»ãªæ¹æ³ã¯ãããŒã¿è€è£œã䜿çšããããã¯ã¢ããã§ããããŒã¿ã®è€æ°ã®ã³ããŒãç°ãªãããŒãã«ä¿åãããŸãã
ãããã¯ãŒã¯åž¯åå¹
ãäºçŽããŠããŸãã ããã¯ãã·ã¹ãã ã®ã³ã³ããŒãã³ãã«é害ãçºçããå Žåãä»ã®ã³ã³ããŒãã³ãã®è² è·ã厩å£ããããšãèš±å¯ã§ããªããããéèŠã§ãã
ãã©ã³ã¹èª¿æŽ
ãŸããããŒã¿ã»ã³ã¿ãŒéã§ãŠãŒã¶ãŒã¯ãšãªã®ãã©ã³ã¹ãåãæ¹æ³ãåŠç¿ãããããèªåçã«è¡ãå¿
èŠããããŸãã ããã¯ããããã¯ãŒã¯äœæ¥ãè¡ãå¿
èŠãããå ŽåããŸãã¯ããŒã¿ã»ã³ã¿ãŒã«é害ãçºçããå Žåã«äœ¿çšããŸãã ããããããŒã¿ã»ã³ã¿ãŒå
ã§ããã©ã³ã¹ãå¿
èŠã§ãã ãŸããããŒãéã§ã©ã³ãã ã«ãªã¯ãšã¹ãã忣ããã®ã§ã¯ãªããéã¿ãä»ããããšèããŠããŸãã ããšãã°ããµãŒãã¹ã®æ°ããããŒãžã§ã³ãã¢ããããŒãããæ°ããããŒããããŒããŒã·ã§ã³ã«ã¹ã ãŒãºã«å
¥åãããå Žåã ã¹ãã¬ã¹ã¯ãã¹ãã¬ã¹ãã¹ãäžã«ãéåžžã«åœ¹ç«ã¡ãŸããããŒãã®æ©èœã®å¶éãçè§£ããããã«ãããŒãã«éã¿ãå¢ããããã倧ããªè² è·ããããŸãã ãŸããããŒãã«è² è·ãããã£ããšãã«é害ãçºçãããšããã©ã³ã¹ã¡ã«ããºã ã䜿çšããŠããŠã§ã€ãããã°ãããŒãã«ããå転ããåé€ããŸãã
ãŠãŒã¶ãŒããããŒããžã®ãªã¯ãšã¹ããã¹ã¯ã©ã®ããã«èŠããŸããïŒããã«ããããã©ã³ã¹ãèæ
®ããããŒã¿ãè¿ãããŸããïŒ

ãŠãŒã¶ãŒã¯Webãµã€ããŸãã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãä»ããŠãã°ã€ã³ãããã©ãã¯URLãåãåããŸãã
musicd.mycdn.me/v0/stream?id=...
URLã®ãã¹ãåããIPã¢ãã¬ã¹ãååŸããããã«ãã¯ã©ã€ã¢ã³ãã¯ããã¹ãŠã®ããŒã¿ã»ã³ã¿ãŒãšCDNãµã€ããç¥ã£ãŠããGSLB DNSã«æ¥ç¶ããŸãã GSLB DNSã¯ãããŒã¿ã»ã³ã¿ãŒã®1ã€ã®ãã©ã³ãµãŒã®IPã¢ãã¬ã¹ãã¯ã©ã€ã¢ã³ãã«æäŸããã¯ã©ã€ã¢ã³ãã¯ãããšã®æ¥ç¶ã確ç«ããŸãã ãã©ã³ãµãŒã¯ãããŒã¿ã»ã³ã¿ãŒå
ã®ãã¹ãŠã®ããŒããšãã®ééãææ¡ããŠããŸãã ãŠãŒã¶ãŒã«ä»£ãã£ãŠãããŒãã®1ã€ãšã®æ¥ç¶ã確ç«ããŸãã
NFWareã«åºã¥ããL4ãã©ã³ãµãŒã
䜿çšããŸã ã Nodaã¯ããã©ã³ãµãŒããã€ãã¹ããŠããŠãŒã¶ãŒããŒã¿ãçŽæ¥æäŸããŸãã ãã£ã¹ããªãã¥ãŒã¿ãŒã®ãããªãµãŒãã¹ã§ã¯ãçºä¿¡ãã©ãã£ãã¯ã¯çä¿¡ãã©ãã£ãã¯ããã倧å¹
ã«é«ããªããŸãã
ããŒã¿ã»ã³ã¿ãŒãã¯ã©ãã·ã¥ããå ŽåãGSLB DNSã¯ãããæ€åºããããŒããŒã·ã§ã³ããããã«åé€ããŸãããã®ããŒã¿ã»ã³ã¿ãŒã®ãã©ã³ãµãŒã®IPã¢ãã¬ã¹ããŠãŒã¶ãŒã«æäŸããããšã忢ããŸãã ããŒã¿ã»ã³ã¿ãŒå
ã®ããŒãã«é害ãçºçãããšããã®éã¿ããªã»ãããããããŒã¿ã»ã³ã¿ãŒå
ã®ãã©ã³ãµãŒã¯ãªã¯ãšã¹ãã®éä¿¡ã忢ããŸãã
次ã«ãããŒã¿ã»ã³ã¿ãŒå
ã®ããŒãããšã«ãã©ãã¯ã®ãã©ã³ã¹ãåãããšãæ€èšããŠãã ããã ããŒã¿ã»ã³ã¿ãŒã¯ç¬ç«ããèªåŸçãªãŠããããšèŠãªãããä»ã®ãã¹ãŠãæ»ãã ãšããŠãããããããçããŠæ©èœããŸãã ãã©ãã¯ã¯ãè² è·ã«æªã¿ãçããªãããã«ããã·ã³å
šäœã§åçã«ãã©ã³ã¹ãåãå¿
èŠããããç°ãªãããŒãã«è€è£œããå¿
èŠããããŸãã 1ã€ã®ããŒãã«é害ãçºçããå Žåãæ®ãã®ããŒãéã§è² è·ãåçã«åæ£ããå¿
èŠããããŸãã
ãã®åé¡ã¯
ããŸããŸãªæ¹æ³ã§
解決ã§ã
ãŸã ã ç§ãã¡ã¯
äžè²«ããããã·ã¥ã«èœã¡çããŸããã ãã©ãã¯èå¥åã®ããã·ã¥ã®å¯èœãªç¯å²å
šäœããªã³ã°ã§ã©ãããããšãåãã©ãã¯ããã®ãªã³ã°äžã®ãã€ã³ãã«è¡šç€ºãããŸãã ãã®åŸãã¯ã©ã¹ã¿ãŒå
ã®ããŒãéã§ãªã³ã°ç¯å²ãã»ãŒåçã«åæ£ããŸãã ãã©ãã¯ãä¿åããããŒãã¯ããã©ãã¯ããªã³ã°äžã®ãã€ã³ãã«ããã·ã¥ããæèšåãã«ç§»åããããšã«ããéžæãããŸãã

ãããããã®ãããªã¹ããŒã ã«ã¯æ¬ ç¹ããããŸããããšãã°ãããŒãN2ã«é害ãçºçããå Žåããã®è² è·å
šäœããªã³ã°å
ã®æ¬¡ã®ã¬ããªã«N3ã«èœã¡ãŸãã ãããŠãçç£æ§ã«2åã®ããŒãžã³ããªãå ŽåïŒãããŠãããçµæžçã«æ£åœåãããªãå ŽåïŒãããããã2çªç®ã®ããŒãã«ãæªãæéããããŸãã é«ã確çã§N3ãçºçããè² è·ãN4ã«å°éããããšããããã«ããªã³ã°å
šäœã«ã«ã¹ã±ãŒãé害ãçºçããŸãã
ãã®åé¡ã¯ãã¬ããªã«ã®æ°ãå¢ãããšè§£æ±ºã§ããŸããããªã³ã°å
ã®ã¯ã©ã¹ã¿ãŒã®åèšæå¹å®¹éã¯æžå°ããŸãã ãããã£ãŠãããããŸããã åãæ°ã®ããŒãã§ããªã³ã°ã¯ããªã³ã°ã®åšãã«ã©ã³ãã ã«æ£ãã°ã£ãŠããéåžžã«å€ãã®ç¯å²ã«åå²ãããŸãã ãã©ãã¯ã®ã¬ããªã«ã¯ãäžèšã®ã¢ã«ãŽãªãºã ã«åŸã£ãŠéžæãããŸãã

äžèšã®äŸã§ã¯ãåããŒãã2ã€ã®ç¯å²ãæ
åœããŠããŸãã ããŒãã®1ã€ã«é害ãçºçããå Žåããã®è² è·å
šäœããªã³ã°å
ã®æ¬¡ã®ããŒãã«ãããããšã¯ãããŸããããã¯ã©ã¹ã¿ãŒã®ä»ã®2ã€ã®ããŒãã«åæ£ãããŸãã
ãªã³ã°ã¯ã¢ã«ãŽãªãºã ã®å°ããªã»ããã«åºã¥ããŠèšç®ãããåããŒãã§æ±ºå®ãããŸãã ã€ãŸãããªãããã®èšå®ã«ã¯ä¿åããŸããã å®çšŒåç°å¢ã«ã¯æ°åäžãè¶
ãããããã®ç¯å²ããããããããã®ããŒãã§é害ãçºçããå Žåãè² è·ã¯ä»ã®ãã¹ãŠã®çããŠããããŒãéã§å®å
šã«åçã«åæ£ãããŸãã
äžè²«ããããã·ã¥ã䜿çšãããã®ãããªã·ã¹ãã ã§ããŠãŒã¶ãŒãžã®ãªã¿ãŒã³ãã©ãã¯ã¯ã©ã®ããã«èŠããŸããïŒ
ãŠãŒã¶ãŒã¯ãL4ãã©ã³ãµãŒãä»ããŠã©ã³ãã ããŒãã«å°éããŸãã ãã©ã³ãµãŒã¯ããããžãŒã«ã€ããŠäœãç¥ããªããããããŒãã®éžæã¯ã©ã³ãã ã§ãã ãã ããã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ã¬ããªã«ã¯ãããèªèããŠããŸãã èŠæ±ãåä¿¡ããããŒãã¯ãèŠæ±ããããã©ãã¯ã®ã¬ããªã«ã§ãããã©ãããå€å¥ããŸãã ããã§ãªãå Žåã¯ãã¬ããªã«ã®1ã€ã䜿çšããŠãããã·ã¢ãŒãã«åãæ¿ããã¬ããªã«ãšã®æ¥ç¶ã確ç«ããããŒã«ã«ã¹ãã¬ãŒãžå
ã®ããŒã¿ãæ€çŽ¢ããŸãã ãã©ãã¯ãååšããªãå Žåãã¬ããªã«ã¯ãã©ãã¯ã¹ãã¢ãããã©ãã¯ãååŸããããŒã«ã«ã¹ãã¢ã«ä¿åãããããã·ãæäŸããŸãããããã·ã¯ããŒã¿ããŠãŒã¶ãŒã«ãªãã€ã¬ã¯ãããŸãã

ã¬ããªã«å
ã®ãã£ã¹ã¯ã«é害ãçºçããå Žåãã¹ãã¬ãŒãžããã®ããŒã¿ã¯ãŠãŒã¶ãŒã«çŽæ¥è»¢éãããŸãã ã¬ããªã«ã«é害ãçºçããå Žåããããã·ã¯ãã®ãã©ãã¯ã®ä»ã®ãã¹ãŠã®ã¬ããªã«ãèªèããå¥ã®ã©ã€ãã¬ããªã«ãšã®æ¥ç¶ã確ç«ããŠãããããããŒã¿ãåä¿¡ããŸãã ãããã£ãŠããŠãŒã¶ãŒããã©ãã¯ãèŠæ±ããå°ãªããšã1ã€ã®ã¬ããªã«ãçããŠããå Žåãå¿çãåãåãããšãä¿èšŒããŸãã
ããŒãã¯ã©ã®ããã«æ©èœããŸããïŒ

ããŒãã¯ããŠãŒã¶ãŒã®ãªã¯ãšã¹ããééããäžé£ã®ã¹ããŒãžããã®ãã€ãã©ã€ã³ã§ãã ãŸãããªã¯ãšã¹ãã¯å€éšAPIã«éãããŸãïŒãã¹ãŠãHTTPSçµç±ã§éä¿¡ããŸãïŒã 次ã«ããªã¯ãšã¹ããæ€èšŒãããŸã-眲åãæ€èšŒãããŸãã æ¬¡ã«ããã©ãã¯ã®è³Œå
¥æãªã©ãå¿
èŠã«å¿ããŠIDv3ã¿ã°ãæ§ç¯ãããŸãã èŠæ±ã¯ã«ãŒãã£ã³ã°ã¹ããŒãžã«é²ã¿ãã¯ã©ã¹ã¿ãŒããããžã«åºã¥ããŠãããŒã¿ãã©ã®ããã«è¿ãããããæ±ºå®ãããŸããçŸåšã®ããŒãã¯ãã®ãã©ãã¯ã®ã¬ããªã«ã§ããããå¥ã®ããŒããããããã·ã«ãªããŸãã 2çªç®ã®å Žåããããã·ã¯ã©ã€ã¢ã³ããä»ããããŒãã¯ã眲åãæ€èšŒããã«ãå
éšHTTP APIãä»ããŠã¬ããªã«ãžã®æ¥ç¶ã確ç«ããŸãã ã¬ããªã«ã¯ãããŒã«ã«ã¹ãã¬ãŒãžå
ã®ããŒã¿ãæ€çŽ¢ãããã©ãã¯ãèŠã€ãããšããã£ã¹ã¯ãããããæäŸããŸãã ããã§ãªãå Žåã¯ãã¹ãã¬ãŒãžãããã©ãã¯ãåŒãåºãããã£ãã·ã¥ããŠæäŸããŸãã
ããŒãè² è·
ãã®æ§æã§1ã€ã®ããŒããä¿æãã¹ãè² è·ãæšå®ããŸãããã ãããã4ã€ã®ããŒããæã€3ã€ã®ããŒã¿ã»ã³ã¿ãŒãèããŠã¿ãŸãããã

ãµãŒãã¹å
šäœã§120ã®ã¬ããã/ç§ãã€ãŸãããŒã¿ã»ã³ã¿ãŒããã40ã®ã¬ããã/ç§ãåŠââçããå¿
èŠããããŸãã ãããã¯ãŒã¯äœæè
ãæäœãè¡ã£ãããŸãã¯äºæ
ãçºçããDC1ãšDC3ã®2ã€ã®ããŒã¿ã»ã³ã¿ãŒããã£ããšããŸãã ä»ããããã®ããããã¯60 Gbit / sãäžããå¿
èŠããããŸãã ããããããã§ããã€ãã®æŽæ°ãå±éããã®ã¯éçºè
次第ã§ãããåããŒã¿ã»ã³ã¿ãŒã«ã¯3ã€ã®ã©ã€ãããŒããæ®ã£ãŠãããããããã20ã®ã¬ããã/ç§ãæäŸããå¿
èŠããããŸãã

ãã ããæåã¯åããŒã¿ã»ã³ã¿ãŒã«4ã€ã®ããŒãããããŸããã ãããŠãããŒã¿ã»ã³ã¿ãŒã«2ã€ã®ã¬ããªã«ãæ ŒçŽãããšã50ïŒ
ã®ç¢ºçã§ããªã¯ãšã¹ããåä¿¡ããããŒãã¯ãªã¯ãšã¹ãããããã©ãã¯ã®ã¬ããªã«ã§ã¯ãªããããŒã¿ããããã·ããŸãã ã€ãŸããããŒã¿ã»ã³ã¿ãŒå
ã®ãã©ãã£ãã¯ã®ååããããã·ãããŸãã

ãã®ããã1ã€ã®ããŒãã§ãŠãŒã¶ãŒã«20 Gb / sãäžããå¿
èŠããããŸãã ãããã®ãã¡ã10 Gb / sã¯ããŒã¿ã»ã³ã¿ãŒå
ã®è¿é£ããååŸããŸãã ãã ãããã®ã¹ããŒã ã¯å¯Ÿç§°çã§ããããŒãã¯åã10 Gb / sãããŒã¿ã»ã³ã¿ãŒå
ã®è¿é£ã«æäŸããŸãã 30 Gbit / sãããŒãããåºãŠãããèŠæ±ãããããŒã¿ã®ã¬ããªã«ã§ããããããã®ãã¡20 Gbit / sãåç¬ã§åŠçãããããšãããããŸãã ããã«ãããŒã¿ã¯ãã£ã¹ã¯ãŸãã¯RAMããéä¿¡ãããŸããRAMã«ã¯çŽ5äžåã®ããããããã©ãã¯ããããŸãã åççµ±èšã«åºã¥ããŠãããã«ãããã£ã¹ã¯ã®è² è·ã®60ã70ïŒ
ãåé€ã§ããçŽ8 Gb / sãæ®ããŸãã ãã®ã¹ã¬ããã¯ã1ããŒã¹ã®SSDãæäŸã§ããŸãã
ããŒãäžã®ããŒã¿ã¹ãã¬ãŒãž
åãã©ãã¯ãå¥ã
ã®ãã¡ã€ã«ã«å
¥ãããšããããã®ãã¡ã€ã«ã管çãããªãŒããŒããããèšå€§ã«ãªããŸãã ããŒããåèµ·åãããã£ã¹ã¯äžã®ããŒã¿ãã¹ãã£ã³ããå Žåã§ããæ°ååã§ã¯ãªãã«ããŠãæ°åããããŸãã
ãã®ã¹ããŒã ã«ã¯ããã»ã©æçœãªå¶éã¯ãããŸããã ããšãã°ãæåããã®ã¿ãã©ãã¯ãããŒãã§ããŸãã ãŠãŒã¶ãŒãäžå€®ããã®åçããªã¯ãšã¹ããããã£ãã·ã¥ã倱ãããå Žåããã©ãã¯ãªããžããªããç®çã®å Žæã«ããŒã¿ãããŒããããŸã§1ãã€ããéä¿¡ããããšã¯ã§ããŸããã ããã«ãããšã3åã§èŽãã®ãããã巚倧ãªãªãŒãã£ãªããã¯ã§ãã£ãŠãããã©ãã¯å
šäœãä¿åããããšããã§ããŸããã ããã¯ãŸã ãã£ã¹ã¯äžã®èªéã§ãããé«äŸ¡ãªã¹ããŒã¹ãç¡é§ã«ãããã®ããŒãã®ãã£ãã·ã¥ããããæžãããŸãã
ãããã£ãŠãå®å
šã«ç°ãªãæ¹æ³ã§ãããè¡ããŸããããã¯ããã©ãã¯ã256 KBãããã¯ã«åå²ããŸããããã¯SSDã®ãããã¯ãµã€ãºãšçžé¢é¢ä¿ãããããã§ã«ãããã®ãããã¯ã§åäœããŠããããã§ãã 1 TBã®ãã£ã¹ã¯ã«ã¯400äžãããã¯ãå«ãŸããŠããŸãã ããŒãå
ã®åãã£ã¹ã¯ã¯ç¬ç«ããã¹ãã¬ãŒãžã§ãããåãã©ãã¯ã®ãã¹ãŠã®ãããã¯ã¯ãã¹ãŠã®ãã£ã¹ã¯ã«åæ£ãããŸãã
ç§ãã¡ã¯ããã«ãã®ãããªã¹ããŒã ã«å°éããŸããã§ãããæåã¯ã1ã€ã®ãã©ãã¯ã®ãã¹ãŠã®ãããã¯ã1ã€ã®ãã£ã¹ã¯ã«çœ®ãããŸããã ãããã人æ°ã®ãããã©ãã¯ããã£ã¹ã¯ã®1ã€ã«ããããããšããã®ããŒã¿ã«å¯Ÿãããã¹ãŠã®èŠæ±ã1ã€ã®ãã£ã¹ã¯ã«éãããããããã£ã¹ã¯éã®è² è·ã«æ·±å»ãªæªã¿ãçããŸããã ãããé²ããããåãã©ãã¯ã®ãããã¯ããã¹ãŠã®ãã£ã¹ã¯ã«åæ£ããè² è·ã忣ããŸããã
ããã«ãRAMãããããããããšãå¿ããŸããããLinuxã«ã¯ãã°ãããããŒãžãã£ãã·ã¥ããããããã»ãã³ãã£ãã¯ãã£ãã·ã¥ãè¡ããªãããšã«ããŸããã
ãããã¯ããã£ã¹ã¯ã«ä¿åããæ¹æ³ã¯ïŒ
æåã«ã1ã€ã®å·šå€§ãªXFSãã¡ã€ã«ããã£ã¹ã¯ãµã€ãºã«ããŠããã¹ãŠã®ãããã¯ããã®äžã«å
¥ããããšã«ããŸããã æ¬¡ã«ããããã¯ããã€ã¹ãçŽæ¥äœ¿çšãããšããã¢ã€ãã¢ãæµ®äžããŸããã äž¡æ¹ã®ãªãã·ã§ã³ãå®è£
ããŠæ¯èŒãããšããããããã¯ããã€ã¹ãçŽæ¥æäœããå Žåãèšé²ã1.5åéããªããå¿çæéã2ã3åçããªããåèšã·ã¹ãã è² è·ã2åäœããªããŸããã
玢åŒ
ãã ãããããã¯ãä¿åããã ãã§ã¯äžååã§ãã鳿¥œãã©ãã¯ã®ãããã¯ãããã£ã¹ã¯äžã®ãããã¯ãžã®ã€ã³ããã¯ã¹ãç¶æããå¿
èŠããããŸãã

éåžžã«ã³ã³ãã¯ãã§ããããšã倿ãã1ã€ã®ã€ã³ããã¯ã¹ãšã³ããªã«å¿
èŠãªã®ã¯29ãã€ãã®ã¿ã§ãã 10 TBã®ã¹ãã¬ãŒãžã®å Žåãã€ã³ããã¯ã¹ã¯1 GBãå°ãäžåããŸãã
ããã«ã¯è峿·±ãç¹ããããŸãã ãã®ãããªåã¬ã³ãŒãã«ã¯ããã©ãã¯å
šäœã®åèšãµã€ãºãä¿åããå¿
èŠããããŸãã ããã¯éæ£èŠåã®å
žåçãªäŸã§ãã ãã®çç±ã¯ãHTTPç¯å²å¿çã®ä»æ§ã«åŸã£ãŠããªãœãŒã¹ã®åèšãµã€ãºãè¿ããšãšãã«ãContent-lengthããããŒã圢æããå¿
èŠãããããã§ãã ããã§ãªããã°ããã¹ãŠãããã«ã³ã³ãã¯ãã«ãªããŸãã
ã€ã³ããã¯ã¹ã«ã¯å€ãã®èŠä»¶ãçå®ããŸããïŒè¿
éã«ïŒã§ããã°RAMã«ä¿åããŠïŒåäœããã³ã³ãã¯ãã§ããŒãžãã£ãã·ã¥ã®ã¹ããŒã¹ãå æããªãããã«ããŸãã å¥ã®ã€ã³ããã¯ã¹ã¯æ°žç¶çã§ãªããã°ãªããŸããã çŽå€±ãããšããã£ã¹ã¯äžã®ã©ã®å Žæã«ã©ã®ãã©ãã¯ãä¿åãããŠãããã«é¢ããæ
å ±ã倱ãããŸããããã¯ãã£ã¹ã¯ã®ã¯ãªãŒãã³ã°ã«çžåœããŸãã ãããŠãäžè¬çã«ã¯ãé·ãéã¢ã¯ã»ã¹ãããŠããªãå€ããããã¯ãäœããã®åœ¢ã§çœ®ãæããŠããã人æ°ã®ãããã©ãã¯ã®ããã®ã¹ããŒã¹ãäœãããã§ãã
LRUã¯ã©ãŠãã£ã³ã°ã¢ãŠãããªã·ãŒãéžæããŸããããããã¯ã¯1åã«1å
ã¯ã©ãŠãã£ã³ã°ããããããã¯ã®1ïŒ
ã¯ç¡æã«ãªããŸãã ãã¡ãããããŒãããšã«10äžã®æ¥ç¶ããããããã€ã³ããã¯ã¹æ§é ã¯ã¹ã¬ããã»ãŒãã§ãªããã°ãªããŸããã ããããã¹ãŠã®æ¡ä»¶ã¯ã
one-nioãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã®
SharedMemoryFixedMap
ã«ãã£ãŠçæ³çã«æºããããŸãã
tmpfs
ã«ã€ã³ããã¯ã¹ãé
眮ããŸãããããã«åäœããŸããã埮åŠãªéãããããŸãã ãã·ã³ãåèµ·åãããšãã€ã³ããã¯ã¹ãå«ã
tmpfs
ã«ãã£ããã¹ãŠã®ãã®ã倱ãããŸãã ããã«ã
sun.misc.Unsafe
ããã»ã¹ãã¯ã©ãã·ã¥ããå Žåãã€ã³ããã¯ã¹ãã©ã®ç¶æ
ã§æ®ã£ãŠãããã¯äžæã§ãã ãããã£ãŠãç§ãã¡ã¯ããã1æéã«1åå°è±¡ã¥ããŸãã ããããããã¯ååã§ã¯ãããŸããããããã¯æŒãåºãã䜿çšãããããæŒãåºããããã¯ã«é¢ããæ
å ±ãæžã蟌ã
WALããµããŒãããå¿
èŠããããŸãã ãã£ã¹ããšWALã®ãããã¯ã«é¢ãããšã³ããªã¯ããªã«ããªäžã«äœããã®æ¹æ³ã§ãœãŒãããå¿
èŠããããŸãã ãã®ããã«ãçæãããã¯ã䜿çšããŸãã ã°ããŒãã«ãã©ã³ã¶ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒã®åœ¹å²ãæãããã€ã³ããã¯ã¹ã倿Žããããã³ã«ã€ã³ã¯ãªã¡ã³ããããŸãã ãããã©ã®ããã«æ©èœãããã®äŸãèŠãŠã¿ãŸãããã
ãã©ãã¯çªå·1ã®2ãããã¯ãšãã©ãã¯çªå·2ã®1ãããã¯ã®3ã€ã®ãšã³ããªãæã€ã€ã³ããã¯ã¹ãäœæããŸãã

ãã£ã¹ããäœæããã¹ããªãŒã ã¯ããã®ã€ã³ããã¯ã¹ã«ãã£ãŠç®èŠããç¹°ãè¿ãããŸããæåãš2çªç®ã®ã¿ãã«ã¯ãã£ã¹ãã«åé¡ãããŸãã ãã®åŸãã¯ã©ãŠãã£ã³ã°ãããŒã¯ã€ã³ããã¯ã¹ã«ã¢ã¯ã»ã¹ãã7çªç®ã®ãããã¯ãé·æéã¢ã¯ã»ã¹ãããŠããªãããšãèªèãããããä»ã®äœãã«äœ¿çšããããšã決å®ããŸãã ããã»ã¹ã¯ãããã¯ã匷å¶çã«åé€ããWALã«ã¬ã³ãŒããæžã蟌ã¿ãŸãã 圌ã¯ãããã¯9ã«å°éããé·ãéé£çµ¡ãåããŠããªãããšã確èªããæ··éããŠãããšããŒã¯ããŸãã ããã§ãŠãŒã¶ãŒãã·ã¹ãã ã«ã¢ã¯ã»ã¹ãããšããã£ãã·ã¥ãã¹ãçºçããŸã-ãã©ãã¯ãèŠæ±ãããŸãããããã¯ãããŸããã ãã®ãã©ãã¯ã®ãããã¯ããªããžããªã«ä¿åãããããã¯9ãäžæžãããŸãã ãã®å Žåãäžä»£ãã€ã³ã¯ãªã¡ã³ãããã22ã«çãããªããŸããæ¬¡ã«ãäœæ¥ãå®äºããŠããªãéåãäœæããããã»ã¹ãã¢ã¯ãã£ãã«ãªããæåŸã®ã¬ã³ãŒãã«å°éããŠéåã«æžã蟌ã¿ãŸãã ãã®çµæãã€ã³ããã¯ã¹ã«ã¯ãã£ã¹ããšWALãšãã2ã€ã®ã©ã€ãã¬ã³ãŒãããããŸãã

çŸåšã®ããŒããèœã¡ããšã次ã®ããã«ã€ã³ããã¯ã¹ã®åæç¶æ
ã埩å
ããŸãã ãŸããWALãã¹ãã£ã³ããããŒãã£ãããã¯ããããäœæããŸãã ã«ãŒãã¯ããã®ãããã¯ã眮ãæãããããšãã®ãããã¯çªå·ããäžä»£ãžã®ãããã³ã°ãä¿åããŸãã

ãã®åŸããããããã£ã«ã¿ãŒãšããŠäœ¿çšããŠãã£ã¹ãã®ç¹°ãè¿ããéå§ããŸãã ãã£ã¹ãã®æåã®ã¬ã³ãŒããèŠããšããããã¯çªå·3ã«é¢é£ããŠããŸãã åœŒã¯æ±ã人ã®éã§ã¯èšåãããŠããŸãããã€ãŸãã圌ã¯çããŠãããã€ã³ããã¯ã¹ã«å
¥ã£ãŠããŸãã 18äžä»£ã§ãããã¯çªå·7ã«å°éããŸãããããŒãã£ãããã¯ãããã¯ã18äžä»£ã§ãããã¯ãæ··ã¿åã£ãŠããããšã瀺ããŠããŸãã ãããã£ãŠãã€ã³ããã¯ã¹ã«ã¯å«ãŸããŸããã 22äžä»£ã®ãããã¯9ã®å
容ãèšè¿°ããæåŸã®ã¬ã³ãŒãã«å°éããŸãã ãã®ãããã¯ã¯ããŒãã£ãããã¯ãããã§èšåãããŠããŸããã以åã«çœ®ãæããããŸããã ãã®ãããæ°ããããŒã¿ã«åå©çšãããã€ã³ããã¯ã¹ã«å
¥ããŸãã ç®æšãéæãããŸããã
æé©å
ããããããã ãã§ã¯ãããŸãããæ·±ãæãäžããŸãã
ããŒãžãã£ãã·ã¥ããå§ããŸãããã æåã¯ãããé Œãã«ããŠããŸããããæåã®ããŒãžã§ã³ã®è² è·ãã¹ãã®å®è¡ãéå§ãããšããããŒãžãã£ãã·ã¥ã®ãããçã20ïŒ
ã«éããŠããªãããšãããããŸããã 圌ãã¯ãåé¡ãå
èªã¿ããããšãææ¡ããŸããïŒãã¡ã€ã«ãä¿åããã®ã§ã¯ãªãããããã¯ããŸãããå€ãã®æ¥ç¶ãæäŸãããã®æ§æã§ã¯ããã£ã¹ã¯ã®æäœã¯ã©ã³ãã ã§ãã é çªã«äœãèªãããšã¯ã»ãšãã©ãããŸããã 幞ããªããšã«ãLinuxã«ã¯
posix_fadvise
åŒã³åºããããããã¡ã€ã«èšè¿°åãã©ã®ããã«äœ¿çšããããã«ãŒãã«ã«äŒããããšãã§ããŸããç¹ã«ã
POSIX_FADV_RANDOM
ãã©ã°ãæž¡ãããšã§å
èªã¿ããå¿
èŠããªããšèšããŸãã ãã®ã·ã¹ãã ã³ãŒã«ã¯
one-nioãä»ããŠå©çšå¯èœã§ãã åäœäžããã£ãã·ã¥ãããã¯70ã80ïŒ
ã§ãã
ãã£ã¹ã¯ããã®ç©ççãªèªã¿åãã®æ°ã¯2åä»¥äžæžå°ããHTTPå¿çã®é
å»¶ã¯20ïŒ
æžå°ããŸãããããã«é²ã¿ãŸãããããµãŒãã¹ã®ããŒããµã€ãºã¯ããªã倧ãããªããŸããããã»ããµã®TLBãã£ãã·ã¥ã®å¯¿åœãå»¶ã°ãããã«ãJavaããã»ã¹ã«Huge Pagesãå«ããããšã«ããŸããããã®çµæãã¬ããŒãžã³ã¬ã¯ã·ã§ã³æéã§é¡èãªå©çãåŸãŸããïŒGCæé/ã»ãŒããã€ã³ãåèšæéã¯20ã30ïŒ
ççž®ãããŸããïŒãã«ãŒãã«ã®èªã¿èŸŒã¿ã¯ããåäžã«ãªããŸããããHTTPã¬ã€ãã³ã·ã°ã©ããžã®åœ±é¿ã¯ãããŸããã§ãããäºä»¶
ãµãŒãã¹ã®éå§åŸããã«ãå¯äžã®ïŒãããŸã§ã®ïŒã€ã³ã·ãã³ããçºçããŸãããå¶æ¥æ¥ã®çµããã®ãã倿¹ã鳿¥œã®æŒå¥ã«é¢ããèŠæ
ãæ¯æãéããŸããããŠãŒã¶ãŒã¯ãæ°ã«å
¥ãã®ãã©ãã¯ãå«ãããšæžããŸããããæ°ç§ããšã«ä»ã®äººãä»ã®äººããå¥åŠãªé³æ¥œãèããã®ã§ããã¬ã€ã€ãŒã¯ãæ°ã«å
¥ãã®ãã©ãã¯ãåçãããšèšããŸãããããªãè¿
éã«æ€çŽ¢ãµãŒã¯ã«ã1å°ã®è»ã«çµã蟌ã¿ãŸããããã°ãããæè¿åèµ·åãããããšãããããŸãããç°¡åã«ããããã«ããããã¯ã®å
容ãèšè¿°ãã2ã€ã®ãã£ã¹ã¯ãšã€ã³ããã¯ã¹ããããŸãããããææšã§ã¯ãDaft Punkãã©ãã¯ã®4çªç®ã®ãããã¯ã¯sdcãã£ã¹ã¯ã®ãããã¯çªå·2ã«ãããStas Mikhailovãã©ãã¯ã®ãŒããããã¯ã¯sddãã£ã¹ã¯ã®ãŒããããã¯ã«ãããŸãã
ãã·ã³ãåèµ·åãããšããã©ã€ãåãå Žæã倿Žãããã®åŸã®çµæããã¹ãŠå€ããããšãããããŸããããã®åé¡ã¯Linuxã§ããç¥ãããŠããŸãããµãŒããŒã«è€æ°ã®ãã£ã¹ã¯ã³ã³ãããŒã©ãŒãããå Žåããã£ã¹ã¯ã®åœåé åºã¯ä¿èšŒãããŸããã
ä¿®æ£ã¯ç°¡åã§ããããšã倿ããŸããããã£ã¹ã¯ã«ã¯ãããã€ãã®ç°ãªãã¿ã€ãã®æ°žç¶IDããããŸãããã£ã¹ã¯ã®ã·ãªã¢ã«çªå·ã«åºã¥ããŠWWNã䜿çšãããããã䜿çšããŠã€ã³ããã¯ã¹ãã¹ãããã·ã§ãããããã³WALãèå¥ããŸããããã¯ãã£ã¹ã¯èªäœã®ã·ã£ããã«ãé€å€ãããã®ã§ã¯ãããŸããããã·ã£ããã«æ¹æ³ã«é¢ä¿ãªãããã£ã¹ã¯äžã®ã€ã³ããã¯ã¹ãããã³ã°ã«éåããããšã¯ãªããåžžã«æ£ããããŒã¿ãæäŸããŸããã€ã³ã·ãã³ãåæ
ãŠãŒã¶ãŒèŠæ±ã¯å€ãã®æ®µéãçµãŠããŒãã®å¢çãè¶ããããããã®ãããªåæ£ã·ã¹ãã ã®åé¡ã®åæã¯å°é£ã§ãã CDNã®å Žåãã¢ããã¹ããªãŒã ãããŒã ããŒã¿ã»ã³ã¿ãŒã§ããããããã¹ãŠãããã«è€éã«ãªããŸãããã®ãããªåžæã¯éåžžã«å€ããããŸããããã«ãã·ã¹ãã ã¯æ°åäžã®ãŠãŒã¶ãŒæ¥ç¶ã«å¯Ÿå¿ããŠããŸããç¹å®ã®ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãã®åŠçã«åé¡ãããæ®µéãçè§£ããããšã¯éåžžã«å°é£ã§ããç§ãã¡ã¯çæŽ»ãæ¥œã«ããŸãããã°ã€ã³æã«ãOpen Tracingããã³Zipkinã«äŒŒãã¿ã°ã§ãã¹ãŠã®ãªã¯ãšã¹ããããŒã¯ããŸããã¿ã°ã«ã¯ããŠãŒã¶ãŒã®èå¥åããªã¯ãšã¹ãããªã¯ãšã¹ãããããã©ãã¯ãå«ãŸããŸãããã®ã¿ã°ã¯ãçŸåšã®æ¥ç¶ã«é¢é£ãããã¹ãŠã®ããŒã¿ãšèŠæ±ãšãšãã«ãã€ãã©ã€ã³å
ã§éä¿¡ãããããŒãéã§ã¯HTTPããããŒãšããŠéä¿¡ãããåä¿¡åŽã«ãã£ãŠåŸ©å
ãããŸããåé¡ã«å¯ŸåŠããå¿
èŠãããå Žåã¯ããããã°ãæå¹ã«ããã¿ã°ããã°ã«èšé²ããç¹å®ã®ãŠãŒã¶ãŒãŸãã¯ãã©ãã¯ã«é¢é£ãããã¹ãŠã®ã¬ã³ãŒããèŠã€ããéçŽããã¯ã©ã¹ã¿ãŒå
šäœã§ãªã¯ãšã¹ããåŠçãããæ¹æ³ãèŠã€ããŸããããŒã¿ãéä¿¡ãã
ãã£ã¹ã¯ãããœã±ããã«ããŒã¿ãéä¿¡ããããã®äžè¬çãªã¹ããŒã ãæ€èšããŠãã ãããè€éãªããšã¯ãªãããã§ãããããã¡ãéžæãããã£ã¹ã¯ãããããã¡ã«èªã¿èŸŒã¿ããããã¡ããœã±ããã«éä¿¡ããŸãã ByteBuffer buffer = ByteBuffer.allocate(size); int count = fileChannel.read(buffer, position); if (count <= 0) {
ãã®ã¢ãããŒãã®åé¡ã®1ã€ã¯ã2ã€ã®é ãããããŒã¿ã³ããŒãããã«é ãããŠããããšã§ããFileChannel.read()
kernel space user space;SocketChannel.write()
, user space kernel space.
幞ããªããšã«ãLinuxã«ã¯ãsendfile()
ãŠãŒã¶ãŒã¹ããŒã¹ãžã®ã³ããŒããã€ãã¹ããŠããã¡ã€ã«ããç¹å®ã®ãªãã»ãããããœã±ããã«ããŒã¿ãçŽæ¥éä¿¡ããããã«ãŒãã«ã«èŠæ±ã§ããåŒã³åºãããããŸãããããŠãã¡ããããã®åŒã³åºãã¯one-nioãéããŠå©çšã§ããŸããè² è·ãã¹ãã§ã¯ã1ã€ã®ããŒãã§ãŠãŒã¶ãŒãã©ãã£ãã¯ãéå§ããããŒã¿ã®ã¿ãéä¿¡ãã飿¥ããŒããããããã·ã匷å¶sendfile()
ããŸãã-10 Gb / sã®ããã»ããµè² è·ã¯äœ¿çšæsendfile()
ã«0 ã«è¿ãã£ããããŠãŒã¶ãŒã¹ããŒã¹SSLãœã±ããã®å Žåã¯ãã§ããŸããæŽ»çšsendfile()
ããŠããã¡ã€ã«ããããŒã¿ããããã¡çµç±ã§éä¿¡ãã以å€ã«éžæè¢ã¯ãããŸããããããŠãããã§å¥ã®é©ãããããŸãããœãŒã¹SocketChannel
ãšãæãäžããå ŽåFileChannel
ããŸãã¯éåæãããã¡ã€ã©ãŒã䜿çšããå ŽåãããŠãã®ããã«ãæ»ãããŒã¿ã®éçšã§poprofilirovatã·ã¹ãã ã¯ãé
ããæ©ãããããªããã¯ã©ã¹ã«ååŸsun.nio.ch.IOUtil
沞隰ãããã¹ãŠã®ã³ãŒã«ããŠã³ããread()
ãšãwrite()
ãããã®ãã£ãã«äžããã®ãããªã³ãŒãã¯ããã«é ãããŠããŸãã ByteBuffer bb = Util.getTemporaryDirectBuffer(dst.remaining()); try { int n = readIntoNativeBuffer(fd, bb, position, nd); bb.flip(); if (n > 0) dst.put(bb); return n; } finally { Util.offerFirstTemporaryDirectBuffer(bb); }
ããã¯ãã€ãã£ããããã¡ã®ããŒã«ã§ããheapã®ãã¡ã€ã«ããèªã¿åãå ŽåByteBuffer
ãæšæºã©ã€ãã©ãªã¯æåã«ãã®ããŒã«ãããããã¡ãŒãååŸããããã«ããŒã¿ãèªã¿åãããããããŒãã«ã³ããŒãByteBuffer
ããã€ãã£ããããã¡ãŒãããŒã«ã«è¿ããŸãããœã±ããã«æžã蟌ããšããåãããšãèµ·ãããŸããç©è°ãéžãã¹ããŒã ãããã§one-nioãåã³å©ãã«ãªããŸããã¢ãã±ãŒã¿ãŒãäœæããŸãMallocMT
-å®éãããã¯ã¡ã¢ãªãŒããŒã«ã§ããSSLãããããããã¡ãä»ããŠããŒã¿ãéä¿¡ããå¿
èŠãããå Žåã¯ãJavaããŒãã®å€åŽã®ãããã¡ãéžæããŠã©ãããByteBuffer
ãFileChannel
ãã®ãããã¡ããäœåãªã³ããŒãªãã§èªã¿åãããœã±ããã«æžã蟌ã¿ãŸãããããŠããããã¡ãã¢ãã±ãŒã¿ã«è¿ããŸãã final Allocator allocator = new MallocMT(size, concurrency); int write(Socket socket) { if (socket.getSslContext() != null) { long address = allocator.malloc(size); ByteBuffer buf = DirectMemory.wrap(address, size); int available = channel.read(buf, offset); socket.writeRaw(address, available, flags);
ããŒãããã100,000æ¥ç¶
ããããã·ã¹ãã ã®æåã¯ãäœã¬ãã«ã§ã®åççãªå®è£
ã«ãã£ãŠä¿èšŒãããŸãããããã«ã¯å¥ã®åé¡ããããŸããåããŒãã®ã³ã³ãã¢ã¯ãæå€§10äžã®åææ¥ç¶ã«å¯Ÿå¿ããŸãããã®ãããªã·ã¹ãã ã§èšç®ãæŽçããæ¹æ³ã¯ïŒæåã«é ã«æµ®ãã¶ã®ã¯ãã¯ã©ã€ã¢ã³ããŸãã¯æ¥ç¶ããšã«å®è¡ã¹ã¬ãããäœæããããšã§ãããã®äžã§ããã€ãã©ã€ã³ã¹ããŒãžã次ã
ã«å®è¡ããŸããå¿
èŠã«å¿ããŠãããã¯ããæ¬¡ã«é²ã¿ãŸãããããããã®ãããªã¹ããŒã ã§ã¯ããã£ã¹ããªãã¥ãŒã¿ãŒã«ã€ããŠè©±ããŠãããããå€ãã®ãããŒããããããã³ã³ããã¹ãã®åãæ¿ããšãããŒã®ã¹ã¿ãã¯ã®ã³ã¹ãã¯éå°ã«ãªããŸãããããã£ãŠãç§ãã¡ã¯ä»ã®æ¹æ³ã§è¡ã£ãã
忥ç¶ã«å¯ŸããŠè«çãã€ãã©ã€ã³ãäœæãããŸããããã¯ãéåæçã«çžäºäœçšããã¹ããŒãžã§æ§æãããŸããåã¹ããŒãžã«ã¯ãçä¿¡ãªã¯ãšã¹ããä¿åããé çªããããŸããã¹ããŒãžã®å®è¡ã«ã¯ãå°ããªå
±éã¹ã¬ããããŒã«ã䜿çšãããŸããèŠæ±ãã¥ãŒããã®ã¡ãã»ãŒãžãåŠçããå¿
èŠãããå ŽåãããŒã«ããã¹ããªãŒã ãååŸããã¡ãã»ãŒãžãåŠçããŠãã¹ããªãŒã ãããŒã«ã«è¿ããŸãããã®ã¹ããŒã ã§ã¯ãããŒã¿ãã¹ãã¬ãŒãžããã¯ã©ã€ã¢ã³ãã«ããã·ã¥ãããŸãããããããã®ãããªã¹ããŒã ã«ã¯æ¬ é¥ããªãããã§ã¯ãããŸãããããã¯ãšã³ãã¯ãŠãŒã¶ãŒæ¥ç¶ãããã¯ããã«é«éã§ããããŒã¿ããã€ãã©ã€ã³ãééãããšããæãé
ãæ®µéã§èç©ãããŸããã¯ã©ã€ã¢ã³ãæ¥ç¶ãœã±ããã«ãããã¯ãæžãèŸŒãæ®µéã§ãé
ããæ©ãããããã¯ã·ã¹ãã ã®åŽ©å£ã«ã€ãªãããŸãããããã®æ®µéã§ãã¥ãŒãå¶éããããšãããšããã§ãŒã³å
ã®ãŠãŒã¶ãŒã®ãœã±ãããžã®ãã€ãã©ã€ã³ããããã¯ãããããããã¹ãŠãå³åº§ã«åæ¢ããŸãããŸããå
±æã¹ã¬ããããŒã«ã䜿çšããŠããããããã®äžã®ãã¹ãŠã®ã¹ã¬ããããããã¯ããŸããèå§ãå¿
èŠã§ãããããè¡ãããã«ããžã§ããã¹ããªãŒã ã䜿çšããŸããããã®ã¢ãããŒãã®æ¬è³ªã¯ããµãã¹ã¯ã©ã€ããŒããããªãã·ã£ãŒããã®ããŒã¿ã¬ãŒããããã³ãã䜿çšããŠå¶åŸ¡ããããšã§ããéèŠãšã¯ããµãã¹ã¯ã©ã€ããŒãåŠçããæºåãã§ããŠããããŒã¿ã®éãšãæ¢ã«éç¥ãããŠãã以åã®éèŠãæå³ããŸãããããªãã·ã£ãŒã«ã¯ããŒã¿ãéä¿¡ããæš©å©ããããŸãããçŸæç¹ã§çޝç©ãããç·éèŠããéä¿¡æžã¿ã®ããŒã¿ãå·®ãåŒãããã®ãè¶
ããããšã¯ã§ããŸããããããã£ãŠãã·ã¹ãã ã¯ããã·ã¥ã¢ãŒããšãã«ã¢ãŒããåçã«åãæ¿ããŸããããã·ã¥ã¢ãŒãã§ã¯ããµãã¹ã¯ã©ã€ããŒã¯ãããªãã·ã£ãŒãããé«éã§ããã€ãŸãããããªãã·ã£ãŒã¯ãµãã¹ã¯ã©ã€ããŒããã®æºè¶³ãããªãèŠæ±ãåžžã«æã£ãŠããŸãããããŒã¿ã¯ãããŸãããããŒã¿ã衚瀺ããããšããã«ã圌ã¯ããã«ãããããµãã¹ã¯ã©ã€ããŒã«éä¿¡ããŸãããã«ã¢ãŒãã¯ããããªãã·ã£ãŒããµãã¹ã¯ã©ã€ããŒããéãå Žåã«çºçããŸããã€ãŸããåºç瀟ã¯ããŒã¿ãéä¿¡ããŠãåé¡ãããŸãããéèŠã®ã¿ããŒãã§ãããµãã¹ã¯ã©ã€ããŒãããå°ãåŠçããæºåãã§ãããšèšã£ããããã«ããããªãã·ã£ãŒã¯ããã«ããŒã¿ã®äžéšãèŠæ±ã®äžéšãšããŠéä¿¡ããŸããã³ã³ãã¢ã¯ãžã§ããã¹ããªãŒã ã«å€ãããŸããåã¹ããŒãžã¯ãåã®ã¹ããŒãžã§ã¯ãããªãã·ã£ãŒã«ãªããæ¬¡ã®ã¹ããŒãžã§ã¯ãµãã¹ã¯ã©ã€ããŒã«ãªããŸãããžã§ããã¹ããªãŒã ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžã«ã·ã³ãã«ã«èŠããŸããPublisher
眲åããŸãããSubscriber
ãããã³åœŒã¯4ã€ã®ãã³ãã©ãŒã®ã¿ãå®è£
ããå¿
èŠããããŸãã interface Publisher<T> { void subscribe(Subscriber<? super T> s); } interface Subscriber<T> { void onSubscribe(Subscription s); void onNext(T t); void onError(Throwable t); void onComplete(); } interface Subscription { void request(long n); void cancel(); }
Subscription
éèŠãéç¥ãã賌èªãè§£é€ã§ããŸããã©ããç°¡åã§ããããŒã¿ã®èŠçŽ ãšããŠããã€ãé
åã¯æž¡ããããã£ã³ã¯ãªã©ã®æœè±¡åãæž¡ããŸããå¯èœã§ããã°ãããŒã¿ãããŒãã«ãã©ãã°ããªãããã«ãããè¡ããŸãããã£ã³ã¯ã¯ãããŒã¿ã®èªã¿åãByteBuffer
ããœã±ãããžã®æžã蟌ã¿ããŸãã¯ãã¡ã€ã«ãžã®æžã蟌ã¿ã®ã¿ãèš±å¯ãããéåžžã«éãããã€ã³ã¿ãŒãã§ã€ã¹ãæã€ããŒã¿ãªã³ã¯ã§ãã interface Chunk { int read(ByteBuffer dst); int write(Socket socket); void write(FileChannel channel, long offset); }
ãã£ã³ã¯ã«ã¯å€ãã®å®è£
ããããŸãã- ãã£ãã·ã¥ãããã®å Žåããã£ã¹ã¯ããããŒã¿ã転éãããšãã«äœ¿çšãããæãäžè¬çãªãã®ã¯ãtopã®å®è£
RandomAccessFile
ã§ãããã£ã³ã¯ã«ã¯ããã¡ã€ã«ãžã®ãªã³ã¯ããã®ãã¡ã€ã«ã®ãªãã»ãããããã³ããŒã¿ã®ãµã€ãºã®ã¿ãå«ãŸããŸãããã€ãã©ã€ã³å
šäœãéãããŠãŒã¶ãŒæ¥ç¶ãœã±ããã«å°éããããã§ã³ãŒã«ã«å€ãããŸãsendfile()
ãã€ãŸããã¡ã¢ãªã¯ãŸã£ããæ¶è²»ãããŸããã - cache miss : . , â , , â .
- , - heap.
ByteBuffer
.
ãã®APIã¯åçŽã§ããã«ããããããã仿§ã§ã¯ã¹ã¬ããã»ãŒãã§ãããã»ãšãã©ã®ã¡ãœããã¯éããããã³ã°ã§ããå¿
èŠããããŸããç§ãã¡ã¯ãè§Šçºãã粟ç¥åä»ã俳åªã¢ãã«ããã¹ãéžæããäŸããå
¬åŒãªããžã㪠ã®ãžã§ããã¹ããªãŒã ãã¡ãœããåŒã³åºããéããããã³ã°ã«ããã«ã¯ãã¡ãœãããåŒã³åºããšãã«ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãååŸããã¡ãã»ãŒãžã«ã©ããããå®è¡ã®ããã«ãã¥ãŒã«å
¥ããŠãå¶åŸ¡ãè¿ããŸãããã¥ãŒããã®ã¡ãã»ãŒãžã¯å³å¯ã«é çªã«åŠçãããŸããåæã¯è¡ãããŸãããã³ãŒãã¯ã·ã³ãã«ã§ç°¡åã§ããç¶æ
ã¯3ã€ã®ãã£ãŒã«ãã§ã®ã¿èª¬æãããŠããŸããåãããªãã·ã£ãŒãŸãã¯ãµãã¹ã¯ã©ã€ããŒã«ã¯ãçä¿¡ã¡ãã»ãŒãžãåéãããã¡ãŒã«ããã¯ã¹ãšããã®ã¿ã€ãã®ãã¹ãŠã®ã¹ããŒãžéã§åå²ããããšã°ãŒãã¥ãŒã¿ãŒããããŸããAtomicBoolean
é£ç¶ããç®èŠãã®åã«èµ·ããã
åŒã³åºãã¯ã¡ãã»ãŒãžã«å€ãããŸãïŒ @Override void request(final long n) { enqueue(new Request(n)); } void enqueue(final M message) { mailbox.offer(message); tryScheduleToExecute(); }
æ¹æ³tryScheduleToExecute()
ïŒ if (on.compareAndSet(false, true)) { try { executor.execute(this); } catch (Exception e) { ... } }
æ¹æ³run()
ïŒ if (on.get()) try { dequeueAndProcess(); } finally { on.set(false); if (!messages.isEmpty()) { tryScheduleToExecute(); } } }
æ¹æ³dequeueAndProcess()
ïŒ M message; while ((message = mailbox.poll()) != null) {
å®å
šã«ãã³ããããã³ã°ã®å®è£
ãã§ããŸãããã³ãŒãã·ã³ãã«ãã€äžè²«æ§ã®ããããªãã«volatile
ãAtomic*
ç«¶åãªã©ãã·ã¹ãã å
šäœã§ã¯ã100,000ã®æ¥ç¶ãåŠçããããã«åèš200ã®ã¹ã¬ããããããŸããæåŸã«
å®çšŒåã§ã¯ã12å°ã®ãã·ã³ããããŸããã垯åå¹
ã«ã¯2å以äžã®ããŒãžã³ããããŸããéåžžã¢ãŒãã®åãã·ã³ã¯ãæ°åäžã®æ¥ç¶ãéããŠæå€§10ã®ã¬ããã/ç§ãæäŸããŸããã¹ã±ãŒã©ããªãã£ãšåŸ©å
åãæäŸããŸããããã¹ãŠãJavaãšone-nioã§æžãããŠããŸãã
ããã¯ããµãŒããŒåŽãããŠãŒã¶ãŒã«äžããããæåã®ãã€ããŸã§ã®ã°ã©ãã§ãã 20ããªç§æªæºã®99ããŒã»ã³ã¿ã€ã«ãéãã°ã©ãã¯ããŠãŒã¶ãŒãžã®HTTPSããŒã¿ã®æ»ãå€ã§ããèµ€ãã°ã©ãã¯ãsendfile()
HTTP ãä»ããã¬ããªã«ãããããã·ãžã®ããŒã¿ã®æ»ãå€ã§ããå®éãå®çšŒåç°å¢ã§ã®ãã£ãã·ã¥ãããã¯97ïŒ
ã§ãããããã°ã©ãã¯ãã©ãã¯ãªããžããªã®ã¬ã€ãã³ã·ã瀺ããŠããŸãããã£ãã·ã¥ãã¹ã®å Žåã¯ããããããŒã¿ãååŸããŸãããããããã¿ãã€ãã®ããŒã¿ãèæ
®ãããšæªããããŸããã
ãã£ã¹ã¯ããæ»ããšãã«75ããŒã»ã³ã¿ã€ã«ãèŠããšã1ããªç§åŸã«æåã®ãã€ãããŠãŒã¶ãŒã«é£ãã§ããŸããã¯ã©ã¹ã¿ãŒå
ã®ã¬ããªã«ã¯ããã«é«éã§éä¿¡ããŸã-300ÎŒsã®è²¬ä»»ããããŸããã€ãŸã
0.7ããªç§ã¯ãããã·ã®ã³ã¹ãã§ãããã®èšäºã§ã¯ãé«éæ§ãšåªãããã©ãŒã«ããã¬ã©ã³ã¹ã®äž¡æ¹ãåããã¹ã±ãŒã©ãã«ã§è² è·ã®é«ãã·ã¹ãã ãæ§ç¯ããæ¹æ³ã瀺ããŸãããæåããããšãé¡ã£ãŠããŸãã