Title: STUFF GOES BAD: ERLANG IN ANGER
AUTHOR: Fred Hebert and Heroku
Link: https://s3.amazonaws.com/erlang-in-anger/text.v1.0.1.pdf
License: a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Title: STUFF GOES BAD: ERLANG IN ANGER
AUTHOR: Fred Hebert and Heroku
Link: https://s3.amazonaws.com/erlang-in-anger/text.v1.0.1.pdf
License: a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Erlangã¯ä»ã®ããã°ã©ãã³ã°èšèªã«æ¯ã¹ãŠãšã©ãŒåŠçã®ã¢ãããŒããç¹å¥ã§ãã å ±éçã«ã¯ããã°ã©ã ãããã°ã©ã ç°å¢ãæ¹æ³è«ã§ãšã©ãŒããããããã«ããŸãã ããã©ã³ã¿ã€ã ã§ãšã©ãŒãèµ·ãããšãã¯äœãå¿ èŠãèããŸãã
ç°å¢ã«ãããã€ããããšã¯ãããšã©ãŒãããã°æ°ããããŒãžã§ã³ããããã€ããå¿ èŠãããã§ãããã
äžæ¹ã§Erlangã¯éçºãéçšãããŒããŠã§ã¢ãšãã£ããããªãã¬ã€ã€ãŒã§ã®åé¡ãããããããã« èšèšãããŠããŸããããã¯ã·ã¹ãã äžã®ãããªããšã©ãŒããåãé€ãããšããããšã§ãã ããããªããå šãŠã®ãšã©ãŒãäºåã«ãããã®ã§ã¯ãªãããšã©ãŒãåãæ±ããããã«ãªããã§ããã°ã ããã¯äºæããŠããªãæ¯ãèãã«ã€ããŠãããã£ãã¢ãããŒãããšãããšããããšã«ãªããŸãã
ããã¯ã¯ã©ãã·ã¥ãããããšããèãæ¹ããããŠããŸãã ãªããªãå šãŠã®ãšã©ãŒãäºåã«é²ããšããã®ã¯éåžžã«ã³ã¹ããé«ãã§ãããŸãããšã©ãŒã«ã€ããŠã¯ ããã°ã©ããŒãå¯ŸåŠæ¹æ³ãç¥ã£ãŠããå¿ èŠãããããã以å€ã¯ããã»ã¹ãçµãããããVMããã®ãŸãŸã«ããŠããããšã«ãªããŸãã
ã»ãšãã©ã®ãã°ã¯åŠçãåèµ·åãããŠããç¶æ ã«æ»ããŸãã Erlangã¯äººéã®å ç«ã·ã¹ãã ãšç䟡ãªç°å¢ãæäŸããŸããä»ã®èšèªã¯ã©ããã£ãŠäœã®äžã«ç åèãæã¡èŸŒãŸãªãããæèããŸãã ã©ã¡ãã®åœ¢åŒãéåžžã«éèŠã§ããã»ãšãã©ã®ç°å¢ã«ããŸããŸãªå¥åº·ç¶æ ãä¿ã€ããã®æ©èœãæäŸããŸãã ä»ã®ç°å¢ã¯ã©ã³ã¿ã€ã æã«ãšã©ãŒãã§ãã¯ãè¡ããŸããããã以éã¯å ç«ã·ã¹ãã ã®ãããªãã®ã¯æäŸããŸããã ã·ã¹ãã ãæåäœãæªãç¶æ ã«ãªã£ããšã厩å£ããªãããã«Erlang/OTPã¯å»è ã«ãªãããšãã§ããŸãã ããªãã¯ã·ã¹ãã ã®äžã«å ¥ããæ¬çªç°å¢ã§ã©ã®ãããªããšãèµ·ããŠãããæ³šææ·±ãèŠãããšãã§ããä¿®æ£ã詊ã¿ãããšãã§ããŸãã Erlangã¯æ£è ãããã«ããããšãå¿ èŠãšãããæŽ»åãäžæããªãããã«ããªãããã¹ããæ¡å€§ããŠæ§ã ãªèšºæãè¡ãããšãã§ããŸãã
ãã®æ¬ã¯Erlangãå©çšããŠæŠæäžã«ã©ããã£ãŠæ²»çãããã¢ããã€ã¹ã§ããããã«ããŸãã Erlangãå©çšãããããã°ã®æ¹æ³ã倱æãã©ãããããŠãããçè§£ããããã®æ¹æ³ã«ã€ããŠèšèŒããŸãã
ããã¯åå¿è åãã®æ¬ã§ã¯ãããŸããããã¥ãŒããªã¢ã«ããã¬ãŒãã³ã°ã»ãã·ã§ã³ã§ã¯ãªããå®éã«æ¬çªç°å¢ã«ãã 蚺æããããã°ç°å¢ã«é¢ãããã®ã§ããã¬ã€ãã©ã€ã³ãçµããŠãããããå èžã¿èŸŒãã äžçã«å ¥ãããã®æé»çãªãã§ãŒãºã§ãã ãã®æ¬ãèªã人ã¯ErlangãšOTPã«ç²ŸéããŠãã人ããšããããŸãã Erlang/OTPã«ã€ããŠã¯ç§ãçè§£ããŠããããã«ã話ãããŸããå°æããå Žåã¯èªè ã®äººã¯èªåã§èª¿ã¹ãããšãã§ãããšæã£ãŠããŸãã æ¢ã«ãœãããŠã§ã¢ã®ãããã°æ¹æ³ã«ã€ããŠçè§£ããŠã人ã¯ãã®æ¬ãèªãå¿ èŠã¯ãªãããšããããŸãã
ãã®æ¬ã¯å€§ããïŒã€ã®ç« ã«åãããŠããŸãã 1ã€ç®ã®å€§ããªè©±ã®ããŒãã¯ã©ã®ããã«ã¢ããªã±ãŒã·ã§ã³ãæžããã§ãã ã³ãŒãããŒã¹ã1ç« ã§èª¬æããŠã2ç« ã§äžè¬çãªããŠããŠã説æããŸãã3ç« ã«ã€ããŠã¯ã·ã¹ãã ãã¶ã€ã³ã«ã€ããŠèª¬æããŸãã 2ã€ç®ã®å€§ããªè©±ã®ããŒãã¯èšºæã«ã€ããŠã§ãã4ç« ã§ã©ã®ããã«ããŒãã«ã€ãªãããã«ã€ããŠã¯ãªããŸãã 5ç« ã§ã¯åºæ¬çãªèšºææ¹æ³ã«ã€ããŠã¯ãªããŸãã6ç« ã§ã¯ã©ãã·ã¥ãã³ãã«ã€ããŠè©±ããŠ7ç« ã¯ã¡ã¢ãªãªãŒã¯ã«ã€ããŠã¯ãªããŸãã 8ç« ã¯CPUã«ã€ããŠã¯ãªããŸãã æçµç« ã§ã¯reconãå©çšããŠæ¬çªç°å¢ã§ã·ã¹ãã ããŠã³ããåã«ã©ã®ããã«ã·ã¹ãã ã³ãŒã«ã远跡ãããã«ã€ããŠã¯ãªããŸãã
ã©ã®ç« ã«ãçè§£ãå©ããããã®è³ªåããã³ãºãªã³ãçšæããŠããŸãã
âãœãŒã¹ãèªãããšâãããããããåä»ãªæ¹æ³ã§ããErlangããã°ã©ãã«ãšã£ãŠã¯ããã¯ããè¡ãã¹ãããšã«ãªããŸãã ã©ã€ãã©ãªã®ããã¥ã¡ã³ããå®å šã¯ãªãªãã£ãããå€ãã£ããå®ç§ã§ã¯ãããŸããã Erlangããã°ã©ãã¯ã©ã¡ãããšãããšLisperã«äŒŒãŠããŠèªåã®åé¡ã解決ããã®ãæåªå ã§ã ãã¹ãããã®ä»äºæ ã解決ãããšããåŸåãããŸããããŸããã ããªãã¯ã³ãŒããèªãã§ãªã«ãããŠããã®ããçè§£ããèªåã§ã³ãŒããä¿®æ£ããŠèªåã®ã·ã¹ãã ã§å©çšã§ããããã«ããå¿ èŠããããŸãã ä»ã®ã©ã®èšèªãããªããèšèšããŠããªãéã䌌ããããªåé¡ã¯ååšããã§ãããã Erlangã«ã¯å€§ããåããŠïŒã€ã®ã¿ã€ãããããŸããäžã€ã¯Erlangã®ããŒã¹ã³ãŒããããäžã€ã¯OTPã¢ããªã±ãŒã·ã§ã³ã ãããŠæåŸã¯OTPãã®ãã®ã«ãªããŸããæ¬ç« ã§ã¯ããããã©ãèªã¿èŸŒãã§ãããèŠãŠãããŸãã
ããErlangã®ã³ãŒããæžããšããããã»ãšãã©ã¯èªåã§æžãããšã«ãªãããšããããŸãã ç¹å®ã®æšæºæ¹æ³ã«æºæ ããŠããã®ã¯ãŸããªã®ã§ãã»ãšãã©ã¯èªåã§äžèº«ãèŠãŠããããšã«ãªããŸãã README.mdãèŠããšã¢ããªã±ãŒã·ã§ã³ã®ãã€ã³ãã¯èè ãžã®ã¢ã¯ã»ã¹æ¹æ³ãæžããŠãããããŸãã 幞éã«ããåå¿è ãçŽ æŽãããErlangããã°ã©ãã«ãã£ãŠãããžã§ã¯ãã¯ã§ããŠããããã æ» å€ã«èªåã§ïŒããæžãå¿ èŠã¯ãªããªã£ãŠããŸããäžè¬çã«ã¯rebarãšããããŒã«ãå©çšããŠOTPã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããŸãã
OTPã¢ããªã±ãŒã·ã§ã³ã®æ§æã¯ã·ã³ãã«ã§ããäžè¬çã«ã¯ä»¥äžã®ãããªãã£ã¬ã¯ããªæ§æãæã¡ãŸãã
doc/
ebin/
src/
test/
LICENSE.txt
README.md
rebar.config
埮åŠã«éããŸãããæ§æã¯ã»ãšãã©åãã§ãã ããããã®OTPã¢ããªã±ãŒã·ã§ã³ã¯ebin/{AppFile}.appãããã¯src/{AppFile}.app.srcãããããå«ãŸããŠããŸãã 2ã€ã®ãã¡ã€ã«ã¯ä»¥äžã®ããã«åäœããŸãã
{application, useragent, [
{description, "Identify browsers & OSes from useragent strings"},
{vsn, "0.1.2"},
{registered, []},
{applications, [kernel, stdlib]},
{modules, [useragent]}
]}.
{application, dispcount, [
{description, "A dispatching library for resources and task "
"limiting based on shared counters"},
{vsn, "1.0.0"},
{applications, [kernel, stdlib]},
{registered, []},
{mod, {dispcount, []}},
{modules, [dispcount, dispcount_serv, dispcount_sup,
dispcount_supersup, dispcount_watcher, watchers_sup]}
]}.
æåã®ã±ãŒã¹ã¯ã©ã€ãã©ãªã¢ããªã±ãŒã·ã§ã³ã§ã2ã€ç®ã®ã±ãŒã¹ã¯æ®éã®ã¢ããªã±ãŒã·ã§ã³ã§ãã
ã©ã€ãã©ãªã¢ããªã±ãŒã·ã§ã³ã¯æ®éappname_somethingãappnameãšããã¢ãžã¥ãŒã«ã§æ§æãããŸãã ããã¯äžè¬çã«ã€ã³ã¿ãã§ãŒã¹ã¢ãžã¥ãŒã«ãªã®ã§ã©ããã£ãŠã¢ã¯ã»ã¹ã§ãããèŠãã®ã«é©ããŠããŸãã ãœãŒã¹ãèªããšã©ããã£ãŠåäœãããèšè¿°ãããŠããŸããããgen_serverãgen_fsmçãããã°ã ããããã©ã®ããã«supervisorãåäœãããããããŸãã ããbehaivorãèšèŒãããŠããªããã°ããªãã®æã§å©çšå¯èœãªã¹ããŒãã¬ã¹ãªã©ã€ãã©ãªã§ãã ãã®äŸã§ã¯èªåã§ãšã¯ã¹ããŒãããŠå©çšå¯èœã«ãªãã®ã§æ©ãçè§£ãå¯èœã«ãªãã§ãããã
æ®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ä»¥äžã«äºã€ãã€ã³ãããããŸãã
æåã®ãã¡ã€ã«ã«ã¯ã©ã®ãããªã©ã€ãã©ãªããã£ãŠãããã«ã€ããŠèšè¿°ãã æ¬¡ã®ãã¡ã€ã«ã«ã¯ãããããã»ã¹ãã©ã®ãããªæ¯ãèããããã®ãèšè¿°ããŸãã ããŸã«æåã®ãã¡ã€ã«ã§äºã€ã®åœ¹å²ãäž¡æ¹èšè¿°ãããšãããããŸãã
ããããªããã¢ããªã±ãŒã·ã§ã³ã«ã©ã€ãã©ãªã远å ããã ãã®ç°¡åãªå€æŽã§ããã°ã appnameãç·šéããã ãã§ããããã¢ããªã±ãŒã·ã§ã³ãä¿®æ£ããã®ã§ããã°ã appname_appãç·šéããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãããã¬ãã«ã§supervisorãèµ·åããpidãè¿åŽããŸãã supervisorã«ã¯ä»åŸèµ·åããchild processã«ã€ããŠãç¹åŸŽãèšè¿°ããŠãããŸãã ããªãŒæ§é äžã§ããé«ãäœçœ®ã«ããããã»ã¹ã¯åºæ¬çã«çå確ç«ãé«ããªããŸãã ã©ã®ããã»ã¹ãéèŠãããŠãããããšãå¯èœã§ããsupervisorå ã§ããã»ã¹ãèµ·åãããš æ¢ã«éããŠããããã»ã¹ã«äŸåããŠé 眮ãããŸãã ããã«äŸåé¢ä¿ãæã£ãããã»ã¹ã¯ã°ã«ãŒãåãããªãã«ããšã©ãŒãèµ·ãããšã㯠äžç·ã«èœã¡ãŠãããŸããããã¯æ éãªéžæã§ãããããªã£ãç¶æ ã埩å ãããã åèµ·åããã»ããæžåœãªå€æã ãšèããããŸãã supervisorã®åèµ·åæŠç¥ã¯supervisorãæã€ããã»ã¹éã«äŸåããŸãã
ãã®æ§é ã¯OTPã¢ããªã±ãŒã·ã§ã³ã§supervisorãããã»ã¹ã®æ±ããæå³ããŸãã ããããç£èŠããããã»ã¹ã¯ä»¥äžã®ãããªåœ¹å²ãæã€ããšãã§ããŸãã
ãããã®ã¢ãžã¥ãŒã«ã¯åæ§ã®æ§æããšããŸãããšã¯ã¹ããŒããããå ¬é颿°ãã³ãŒã«ããã¯é¢æ°ã ãã©ã€ããŒã颿°ãå©çšã§ããŸãã ãããã®supervisorã®é¢ä¿ãšçš®é¡ãããŒã¹ã«ããŠä»ã®ã¢ãžã¥ãŒã«ãå©çšãããããããããªå®è£ ã èšè¿°ãããŠããŸãã
å šãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯äŸåé¢ä¿ããã£ãŠããããããã®äŸåé¢ä¿ã¯ããããäŸåé¢ä¿ããã£ãŠããŸãã OTPã¢ããªã±ãŒã·ã§ã³ã¯åºæ¬çã«ãããã®éã§ç¶æ ãæã¡ãŸãããããããã¯éçºè ãapp fileã«èšè¿°ãããšãã æ£ãããããŒã«ãã£ãŠä¿ãããŠããŸããå³1.1ã«OTPã¢ããªã±ãŒã·ã§ã³ã®æ§é ãçè§£ããã®ã«åœ¹ç«ã€ãã®ãã®ããŠããŸãã ãã®ãããªããšã©ã«ããŒã䜿ã£ãŠã©ãã«äœãããããŠããã®ãçè§£ããããšãã§ããŸããããã«äŒŒãã¹ã¯ãªãããšããŠã reconãå©çšããŠescript script/app_deps.erlãæŽ»çšããŸãã䌌ããããªæ§æã¯observeã¢ããªã±ãŒã·ã§ã³ããããŸãã ããããsupervisoræ§æããšã£ãŠããŸãã ããããå©çšããããšã§ã³ãŒãã®çè§£ãå©ããããšã«ãªããŸãã
OTPã®ãªãªãŒã¹ã¯ãããã«ããOTPã¢ããªã±ãŒã·ã§ã³ããçè§£ããã®ã¯ç°¡åã§ãã OTPãªãªãŒã¹ã¯ãªãªãŒã¹å¯èœãªOTPã¢ããªã±ãŒã·ã§ã³ãããã±ãŒãžåããããã®ã§ãã©ã®ã¢ããªã§ã application:start/2ãåŒã¶ããšã§ç«ã¡äžããšã·ã£ããããŠã³ãå¯èœã«ããŸãã åã®OTPã®ããŒãžã§ã³ã§ãªãªãŒã¹ããŠããã¢ããªã±ãŒã·ã§ã³ãåºæ¬çã«ã¯é©çšå¯èœã§ãã éåžžããã«èšå®ããŒã«ã§ããsystoolsãreltoolãå©çšããŠããã±ãŒãžã³ã°ãè¡ããŸãã ããããçè§£ããããã«ãç§ã¯http://learnyousomeerlang.com/release-is-the-wordãèªãã®ãããããããŸãã ããå¯èœãªã2014幎ã®é ã«ãªãªãŒã¹ãããrelxãå©çšã§ãããšç°¡åã§ãã
ã»ãšãã©ã®Erlangã®æ¬ã¯ã©ã®ããã«ããŠOTPã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããã«ã€ããŠæžãããŠããŸãã ãããããã€ãã®æ¬ã¯Erlangã³ãã¥ããã£ã®è©±ãªã©ãã¯ãã£ãŠããŸãããããã¯æ¬è³ªã§ã¯ãããŸããã ãã®ç« ã§ã¯ç°¡åã«Erlangã«ç¹åããç°¡åãªãã¢ãŒãè¡ãããã«ããŸãã OTPã¢ããªã±ãŒã·ã§ã³ã¯Erlangã®äººãèšè¿°ããã»ãšãã©ã®ãªãŒãã³ãœãŒã¹ã«ãªã£ãŠããŸãã äºå®ãããããã®äººãOTPã®ãªãªãŒã¹ãå¿ èŠãšããŠããŸããããããªããæžããŠããäœãã誰ãã®ã¢ãžã¥ãŒã«ã å©çšããŠããã®ã§ããã°ããã¯ããããOTPã¢ããªã±ãŒã·ã§ã³ã§ãããã ããªããæ§ç¯ããã¢ããªã±ãŒã·ã§ã³ãã§ããã€ããã®ã§ããã°ãã£ãšããã¯OTPãªãªãŒã¹ãå©çšããŠãããšæããŸãã
ã¡ã€ã³ã®ãã«ãããŒã«ãšããŠrebarãšerlang.mkããµããŒãããŠããŸãã ãã©ãŒãããã¯Erlangã¹ã¯ãªããã§ããèªèº«ãæšæºã©ã€ãã©ãªããµããŒãããŠããŸããerlang.mk㯠åé·ã§ããéåžžã«é«éã«ã³ã³ãã€ã«ãããŸãã ãã®ç« ã§ã¯rebarãåæãšãã解説ãããŸããrebarãerlang.mkããµããŒãããŠããããšã«ã€ããŠãã話ããŸãã
OTPã¢ããªã±ãŒã·ã§ã³ã®æ§æã¯OTPãªãªãŒã¹ãšã¯å°ãéããŸãã OTPã¢ããªã±ãŒã·ã§ã³ã¯é ç¹ã«äžã€ã®supervisorãããŠãã®äžã«ããããã®äŸåé¢ä¿ãååšããŸãã OTPãªãªãŒã¹ã¯è€æ°ã®OTPã¢ããªã±ãŒã·ã§ã³ããã£ãŠãããããäŸåããŠããªãå¯èœæ§ããããŸãã
OTPã¢ããªã±ãŒã·ã§ã³ã®åºæ¬æ§æã¯åç« ã§ã話ãããŠãããã®ãšå€§äœåãã§ãã
1 doc/
2 deps/
3 ebin/
4 src/
5 test/
6 LICENSE.txt
7 README.md
8 rebar.config
æ°ããã®ã¯deps/ã§ããããã¯rebarã«ãã£ãŠèªåçã«çæããããã®ã§ãã ããã¯Erlangã«ã¯æšæºçãªããã±ãŒãžç®¡çããŒã«ããªãããã§ãã 人ã ã¯ä»£ããã«rebarãè²ãŠãŠãããžã§ã¯ãã管çããããã«ãªããŸãããããã¯ã³ã³ããªã¯ãã¯ãªããªããŸããã ããããã§äŸåæ§ãããŠã³ããŒãããå¿ èŠããããŸãã ãããrebar.configã®äŸã§ãã
1 {deps,
2 [{application_name, "1.0.*",
3 {git, "git://github.com/user/myapp.git", {branch,"master"}}},
4 {application_name, "2.0.1",
5 {git, "git://github.com/user/hisapp.git", {tag,"2.0.1"}}},
6 {application_name, "",
7 {git, "https://bitbucket.org/user/herapp.git", "7cd0aef4cd65"}},
8 {application_name, "my regex",
9 {hg, "https://bitbucket.org/user/theirapp.hg" {branch, "stable"}}}]}.
ã¢ããªã±ãŒã·ã§ã³ã¯gitããååž°çã«ååŸãããŸãããããã¯ååŸåŸã³ã³ãã€ã«ãªãã·ã§ã³ã«ãã£ãŠã³ã³ãã€ã«ãããŸãã ãã®ãã£ã¬ã¯ããªã®äžã§OTPã¢ããªã±ãŒã·ã§ã³ã®éçºãè¡ããŸãã ããããã³ã³ãã€ã«ããããã«ãrebar get-deps compileãåŒã³åºããšããŠã³ããŒãããŠã¢ããªããšã³ã³ãã€ã«ããŸãã ã¢ããªã±ãŒã·ã§ã³ãäžçã«å ¬éããéãäŸåæ§ç¡ãã§é ä¿¡ããããšãã§ããŸãã ããã«ãã£ãŠããªããããããã«åãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ãããè€æ°ååºè·ããå¿ èŠããããŸããã ãã«ãã·ã¹ãã ã¯éè€ããŠããéšåãçè§£ããå¿ èŠãªåŠçãäžåã ãåŒã³åºãããã«ããŸãã
ãªãªãŒã¹ã®å Žåãæ§æãè¥å¹²ããããŸãããªãªãŒã¹ã¯ã¢ããªã±ãŒã·ã§ã³ã®éåã®ããã ãããåæ ãããŸãããããã¬ãã«ã«ã¢ããªãé 眮ããªã代ããã«ãappsãšdepsã« ãã¹ãããã¢ããªãé 眮ããŸããapps以äžã«ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããé 眮ããŠã deps以äžã«äŸåé¢ä¿ãèšè¿°ããŸãã
apps/
doc/
deps/
LICENSE.txt
README.md
rebar.config
ãªãªãŒã¹ã«å¿ èŠãªãã®ãçæããŸããSystoolãšReltoolã¯ããããã«ããŒããŠããããŠãŒã¶ã楜ã«ãããŸãã ããã«æè¿ã¯relxãå©çšããã®ãäžè¬çã«ãªã£ãŠããŸãã relxãå©çšãããšä»¥äžã®ãããªãã¡ã€ã«ãçæãããŸãã
1 {paths, ["apps", "deps"]}.
2 {include_erts, false}. % will use currently installed Erlang
3 {default_release, demo, "1.0.0"}.
4
5 {release, {demo, "1.0.0"},
6 [members,
7 feedstore,
8 ...
9 recon]}.
relxãåŒã¶ãšãªãªãŒã¹çšã®ããã±ãŒãžã_rel以äžã«é 眮ããŸãã ããrebarã奜ããªãrebar.configã«ä»¥äžã®ããã«è¿œèšããŠãããšãã䟿å©ã«ãªããŸãã
{post_hooks,[{compile, "./relx"}]}.
ããããŠãããšrebar comileãããšãã®éã«relxããã°ããããã«ãªããŸãã
è€éãªã·ã¹ãã ã§ã¯ã»ãšãã©ã®å€±æãšãšã©ãŒã¯ãã®ç¶æ ã§ã®ã¿ããããã®ã§ããªãã©ã€ããã®ã ããæ¹æ³ã ãšããããŠããŸããJim Grayã®è«æã§ã¯Mean Times Between Failuresã«ãããšäžèšã®ãã°ã¯ supervisorã®ãªã¹ã¿ãŒããããªããã4ååªããŠãããšã§ãŠããŸãã 倧äºãªã®ã¯Erlangã®supervisorsãšãã®åããã»ã¹ã®èµ·åã¯åæçãšããããšã§ãã åOTPããã»ã¹ãèµ·åããé¢é£ããã»ã¹ãå®ãå¯èœæ§ããããšããããšã«ãªããŸãã ããã»ã¹ãæ»ãã å ŽåãããŸãã«é »ç¹ã«å€±æãããŸã§ãªãã©ã€ãããããã«ãªããŸãã éåžžã«ãã¹ãèµ·ãããããå ŽæããããŸããsupervisorãããã»ã¹ã®ã¯ã©ãã·ã¥åŸã«åèµ·åããåã« åŸ ã¡æéã¯ãããŸããããããããã¯ãŒã¯ããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ãåæåãã§ãŒãºäžã«ãªã¢ãŒãå ã®ãµãŒãã¹ã èœã¡ãå Žåããã®ã¢ããªã±ãŒã·ã§ã³ã¯å€§éã«ç¡é§ãªåèµ·åãè¡ãã§ãããããããŠããã®ã·ã¹ãã ã¯ã·ã£ããããŠã³ããŸãã å€ãã®Erlangéçºè ãsupervisorãå·åŽæéãæã£ãæ¹ãããã®ã§ã¯ãªãããšäž»åŒµããŠããŸãã ç§ã¯åçŽãªä¿èšŒã«é¢ããçç±ã§ããã匷ãå察ããŠããŸãã
ããã»ã¹ãåèµ·åããããšã¯ããç¥ãããç¶æ ã«æ»ãããã§ããããããç©äºã¯ãªãã©ã€ãããŸãã å ã»ã©ã®äŸã®ããã«åæåãå®å®ããŠããªãå Žåãsupervisorã®ãã€ã¡ãªããã¯å°ããã§ãã åæåããã»ã¹ã¯äœããã£ãŠãå®å®ãã¹ãã§ããåããã»ã¹ãã¡ã¯äºåã«ç¢ºèªããããã§èµ·åããããšã§ ãããŠããå¥å šãªç¶æ ã§èµ·åããããšãã§ããŸãã ããããªãããããã£ãæ§æãæäŸããªãå Žåtry...catchç¯ã§ã«ãŒãããã ãã§ã¡ãªãããã»ãšã㩠享åã§ããªãã§ããããsupervisorã®ããã»ã¹ã¯åæåã®ãªãã§ãã¹ããšãã©ãŒãã§ã¯ãªãã å®å šã«ä¿èšŒãã¹ãã§ããããã¯äŸãã°ããªããããŒã¿ããŒã¹ããµãŒãã¹ã«æ¥ç¶ããã¯ã©ã€ã¢ã³ããèšè¿°ããå Žåã åé¡ããªãããšãä¿èšŒã§ãããŸã§ã¯åæåã®äžã§æ¥ç¶ã確ç«ããŠã¯ãããªããšããããšã§ãã
äŸãã°ããªããErlangã·ã¹ãã ãç«ã¡äžããåã«ããŒã«ã«ã®ããŒã¿ããŒã¹ãç«ã¡äžããŠããã®ã§ã åæåã®ã®ãªãã§æ¥ç¶ã確ç«ã§ãããšãããšãåèµ·åãããšæ£åžžã«åäœããŸãã åææ¡ä»¶ã®ä¿èšŒãã§ããªãå ŽåãããŒãã¯ã¯ã©ãã·ã¥ããŸããããã¯ã·ã¹ãã å šäœã®æ€èšŒãšããŠã¯å€±æã§ãã
ããããŒã¿ããŒã¹ããªã¢ãŒãã«ããå Žåæ¥ç¶ã«å€±æããå Žåãèããªããã°ãããŸããã ããã¯åæ£ã·ã¹ãã ãèœã¡ãŠãããšããããšã«ãªããŸãããã®ç¶æ ã§ããªããä¿èšŒã§ããã®ã¯ æ¥ç¶ãªã¯ãšã¹ããéãããšã ãã§ããã{error, not_connected}ãåºãã ãã§ãã ããŒã¿ããŒã¹ãžã®åæ¥ç¶ã¯ã·ã¹ãã ã®å®å®æ§ã«åœ±é¿ãäžããããšãªããããªããæé©ã ãšä¿¡ããå·åŽæéãéããŠãã è¡ãããšã«ãªããŸããæé©åçãè¡ãåæåãã§ãŒãºã§ã¯è©ŠããŸãããããã»ã¹ã®å Žåãäœãããã®çç±ã§æ¥ç¶ãåã㊠ãã®åŸåæ¥ç¶ã§ããããã«ããªãããã°ãªãããªãããã§ãã
ããå€éšæ¥ç¶ã§éå®³ãæ³å®ããå Žåãããªãã®ã·ã¹ãã èªäœã§ä¿èšŒãè¡ãããã«ããªãã§ãã ããã ç§ãã¡ã¯çŸå®äžçãåãæ±ããããäŸåããå€éšã·ã¹ãã ã¯åžžã«ãªãã·ã§ã³ã§ããã¹ãã§ãã
ãã¡ããã©ã€ãã©ãªãããã»ã¹ãåŒã³åºããã¯ã©ã€ã¢ã³ããããŒããŒã¹ãªãã§åãããšãæåŸ ããŠããªãå Žåã ãšã©ãŒã«ãªããŸããããžãã¹äžã®ã«ãŒã«ãã¯ã©ã€ã¢ã³ãã«å¯ŸããŠã§ãã/ã§ããªããèšå®ããããšãš 察åŠããããšã¯åãåé¡ã§ãå šãéãæ¹éã®åé¡ã§ãã äŸãã°ã¯ã©ã€ã¢ã³ãã¯ã·ã¹ãã å šäœã«åœ±é¿ããªããããªãšã©ãŒãç¡èŠã§ããããã«ããéçšãæ€èšãã¹ãã§ãã
åæåãšsupervisorsã®ã¢ãããŒãã§éãç¹ã¯ã¯ã©ã€ã¢ã³ããåŒã³ã ãåŽã¯ã¯ã©ã€ã¢ã³ãèªèº«ã§ã¯ãªãã®ã§ã ã©ã®çšåºŠå€±æã蚱容ã§ããã®ã決ããããšãã§ããŸãã ããã¯ãã©ã«ããã¬ã©ã³ããã§ãã¶ã€ã³ããã®ã«éåžžã«éèŠã§ããsupervisorsãåèµ·åããå Žåã¯ã å®å®ããç¶æ ã§ã¯ãªããšãããŸããã
以äžã«ããã»ã¹ã®ç¶æ ãã®äžéšã§æ¥ç¶ãä¿èšŒããã³ãŒããèšè¿°ããŸãã
1 init(Args) ->
2 Opts = parse_args(Args),
3 {ok, Port} = connect(Opts),
4 {ok, #state{sock=Port, opts=Opts}}.
5
6 [...]
7
8 handle_info(reconnect, S = #state{sock=undefined, opts=Opts}) ->
9 %% try reconnecting in a loop
10 case connect(Opts) of
11 {ok, New} -> {noreply, S#state{sock=New}};
12 _ -> self() ! reconnect, {noreply, S}
13 end;
ãããã«æžãçŽããã³ãŒãã以äžã«ãªããŸãã
1 init(Args) ->
2 Opts = parse_args(Args),
3 %% you could try connecting here anyway, for a best
4 %% effort thing, but be ready to not have a connection.
5 self() ! reconnect,
6 {ok, #state{sock=undefined, opts=Opts}}.
7
8 [...]
9
10 handle_info(reconnect, S = #state{sock=undefined, opts=Opts}) ->
11 %% try reconnecting in a loop
12 case connect(Opts) of
13 {ok, New} -> {noreply, S#state{sock=New}};
14 _ -> self() ! reconnect, {noreply, S}
15 end;
æžãçŽããããšã«ãã£ãŠãåæåã®äžã§ããã€ãã®ä¿èšŒãè¡ãããã«ããŸããã ããã§æ¥ç¶ãã§ããããšã確èªããŠããæ¥ç¶ãããŒãžã£ãå©çšå¯èœã«ãããšããåãã«ãªããŸãã
ã·ã¹ãã ã«å¯ŸããŠ2ã€ã®ã¢ãããŒãã§æ€èšãè¡ããŸããã èšå®ãã¡ã€ã«ã®ãããªãã¡ã€ã«ã·ã¹ãã ãžã®ã¢ã¯ã»ã¹ããã°ã§UDPããŒããéããããªããŒã«ã«ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã ãããã¯ãŒã¯ããã£ã¹ã¯ããã®åŸ©å çsupervisorã¯èŠä»¶ãšããŠã©ã®çšåºŠåæçã«åŸ ã€ã®ãåé¡ãªãã®ãèšå®ããããšã« ãªãã§ããããïŒåºæ¬çã«ã¯èµ·åãã10åãããã®ã¯ãŸãã§ãããGBã¬ãã«ã®åæãªã©ã¯åé¡ãªãã¯ãã§ãïŒ äžæ¹ã§ãã³ãŒããããŒã«ã«ã«ãªãããŒã¿ããŒã¹ãå€éšãµãŒãã¹ã«äŸåããå Žåã¯ãéåžžã®æäœäžã«ãããå¯èœæ§ãããã ããã¯ä»ã§ãåŸã§ã代ããããªãã®ã§ãsupervisorãéšåçã«èµ·åããæ¹éã«ãããšããã§ãããã ããªãã¯åæ§ã«åŠçãã¹ãã§ããã·ã¹ãã å ã§ã®å¶çŽã¯æžãããæ¹ãããã§ãããã
倱æãé£ç¶ããããšãããŒããæ»ãã ãšããèããã®ã¯æ£ãããããŸãããäžåºŠã·ã¹ãã ãOTPã¢ããªã±ãŒã·ã§ã³ãšã㊠皌åããããã®åŸã¯ããèªèº«ãããŒããçåå¯èœãã©ãã倿ãã¹ãã§ãã ããããã®OTPã¢ããªã±ãŒã·ã§ã³ã¯3ã€ã®æ¹æ³ã§ç«ã¡äžããããšãã§ããŸããpermanent, transient, temporaryã§ ãããã¯application:start/2ã§åŒã³åºãããšãã§ãããããªãã®ãªãªãŒã¹èšå®ãã¡ã€ã«ã«èšè¿°ããããšãå¯èœã§ãã
ãã¡ããOTPé äžã«ããã¢ããªã±ãŒã·ã§ã³ãåèµ·åããããšãå¯èœã§ãã
æã¯ãç§ãäžçªééããŠãããšã©ãŒã®åå ã¯ã¡ã¢ãªäžè¶³ã«ãããã®ã§ããã ããã«ãããšãããã¯ã¡ãã»ãŒãžãã¥ãŒã«ãããã®ã§ããã ããã«å¯Ÿããæ±ãæ¹ã¯ãããããããŸãããã©ã察å¿ãããã«ã€ããŠã¯ã ããããŠããã·ã¹ãã ãçè§£ããå¿ èŠããããŸãã ç©äºãåçŽåããŠãããšãã»ãšãã©ã®ãããžã§ã¯ãã¯ãã¹ã«ãŒã ã®ã·ã³ã¯ã«ã¿ããŠããŸãã ãŠãŒã¶ãšããŒã¿ã®å ¥åã¯èå£ããããŠããŸããErlangã·ã¹ãã ã¯ã·ã³ã¯ãšãã€ãã§ã åºåã¯äžæ°Žéã·ã¹ãã ãšèããããšãã§ããŸããErlangã®ããŒããäœãããã®çç±ã§ ããµããŠããŸã£ãå Žåãäœãåå ãèããããšãããããŠéèŠã§ãã 誰ãã倧éã«æ°Žãã·ã³ã¯ã«ãããŠããŸãããïŒäžæ°Žéã·ã¹ãã ã¯æ£åžžã«ããããŠããŸããïŒ
å°ãããããã€ããèšèšããŸãããïŒ ãã¥ãŒãå£ããããã«ããã®ã¯ãããªã«é£ããããšã§ã¯ãããŸãããã¯ã©ãã·ã¥ãã³ãã§ãã®æ å ±ãèŠã€ããããšãã§ããŸãã ãããããªãå£ããããç¥ãã®ã¯å°ãããªãããŒã§ããããã»ã¹ã®åœ¹å²ãå®è¡æã®æ å ±ãããšã«ã æ°Žãæ¥æ¿ã«æµããŠããã®ããããã»ã¹ããããã¯ãããŠããªãããªã©èããããšãã§ããŸãã äžçªé£ããéšåã¯ãããã©ã®ããã«ããŠçŽããã§ãã ã·ã³ã¯ãå€ãã®å»æ£ç©ã§ã€ãŸã£ãå Žåãã·ã³ã¯èªäœã倧ããããããšããŸãã ã·ã³ã¯ã®ææ°Žãå°ããããããã§ããã°ãããæé©åããŸãããããããã€ãèªäœãçããªãã確èªã㊠ããã§ããã°æé©åããŸããäžæ°Žéããã以äžå¯Ÿå¿ã§ããªããªãããã«ãªããŸã§ã¯è² è·ã¯ã·ã¹ãã ã®äžã§ 察å¿ããããšã«ãªããŸããããã§ã®ãã€ã³ãã¯ãã·ã³ã¯ããã¹ã«ãŒã ã®è¿œå ãå šäœã®è² è·ãèŠãŠæ±ºããããšã§ãã
ãããŠãã¹ã«ãŒã ã®ã¬ãã«ã§ããä»¥äžæ¹åã§ããªãç¹ããããŸãããã°ãéããããŠãããã ããŒã¿ããŒã¹ã®äžè²«æ§ã§åŸ ã€å¿ èŠããã£ãããçµç¹ã®äžã§ååãªç¥èãæãŠãŠããªãã±ãŒã¹ãèããããŸãã ãã€ã³ããæ¢ãããšã«ãã£ãŠãæ¬åœã®ããã«ããã¯ãã€ã³ããæ¢ãããšãã§ãããããŸã§ã®æé©åãå¿ èŠã ã£ãããšã¯ æããŸããã幟åç¡é§ã«ãªã£ãŠããŸã£ãŠããããšãããããŸããç§ãã¡ã¯ããè³¢æã«ãªãå¿ èŠããããŸãã ããã·ã¹ãã ã軜ãããããã«æ å ±ãããèšèšããå¿ èŠããããŸãã ããã«è² è·ãé«ããããšã·ã¹ãã ã®å¶çŽããããŠããã廿£ããããµãŒãã¹ã®è³ªãäžãããé£ãã倿ãå¿ èŠã«ãªããŸãã ãããã®ã¡ã«ããºã ã«é¢ããäºã€ã®æŠç¥ã"back-pressure"ãš"load-shedding"ã«ãªããŸãã
ãã®ç« ã§ã¯Erlangã·ã¹ãã ãå ±éçã«è² è·ããããŠããŸãåå ã«ã€ããŠèŠãŠãããŸãã
æ°å°ãªãåå ã§ã¯ãããŸãããã©ã®ãããªèšèšã仿§ãšãè² è·ãããµããŠããŸãã±ãŒã¹ããããŸãã ãããã¯ã¹ã±ãŒã«ã¢ãããã·ã¹ãã ãæé·ãããšãããæ³å®ããå°é£ãªåé¡ãçºçããå Žåã«èŠãããŸãã
ç®èãªããšã§ããããšã©ãŒãã°ã¯æãå£ãããããã®ã®äžã€ã§ããErlangãã€ã³ã¹ããŒã«ãããšãã®ããã©ã«ãã§ã¯ã ãšã©ãŒãã°ã®ãããã¯ãŒã¯ãããã¯ãã£ã¹ã¯äžã«æžãåºãããšã¯ãšã©ãŒã®çºçããå€ãã®æéãããããŸãã ããã¯ãŠãŒã¶ãçæãããã°ã¯å€§èŠæš¡ãªããã»ã¹ã®ã¯ã©ãã·ã¥ã«ç¹ã«åœãŠã¯ãŸããŸãã åè ã®å Žåããšã©ãŒãã°ã¯ç¶ç¶çã«å ¥ã£ãŠããã¡ãã»ãŒãžãæåŸ ããŠããŸããããããã£ãã±ãŒã¹ã¯äŸå€çã§ åºæ¬çã«å€ãã®ãã©ãã£ãã¯ãæåŸ ããŠããŸãããåŸè ã®å Žåãããã»ã¹å šäœã®ç¶æ ããã°ã«ã³ããŒãããŸãã ããã ãã§ã¡ã¢ãªãéŒè¿«ããã¡ãã»ãŒãžãåãåãããããOutOfMemoryã«ãªãããªãå Žåã 远å ã®åŠçã«æéããããå¯èœæ§ããããŸããå·çæç¹ã§ã®æåã®è§£æ±ºçã¯lagerãšããã©ã€ãã©ãªãå©çšããããšã§ãã lagerã¯å šãŠã®åé¡ã解決ããèš³ã§ã¯ãããŸãããããããå€ããããOTPã®ãšã©ãŒãã°ã¡ãã»ãŒãžãåãæšãŠã åçã«ãŠãŒã¶ã¡ãã»ãŒãžã®åæãšéåææ¹åŒã§å¿ èŠã«å¿ããŠåãæ¿ããŸãã ããã¯ãŠãŒã¶ãéä¿¡ããŠãã倧éã®ã¡ãã»ãŒãžãæããããªããšã¯ã§ããŸãããããããã£ãå Žå㯠ããã°ã©ããå¶åŸ¡ããŠãããã®ã§ãã
ããã¯ãšãããã¯åœä»€ã¯ããã»ã¹éã§ç¶ç¶çã«ã¿ã¹ã¯ãããåãããŠããäžã§ããããã»ã¹ãäºæ³ä»¥äžã«é·ã æéãããã£ãŠãããšãã«ããåé¡ã«ãªããŸããããããäŸã®äžã€ãšããŠãTCPãœã±ããããã¡ãã»ãŒãžãåãåãã®ã åŸ ã£ãŠããå Žé¢ãããèŠãŸãããã®ã¿ã€ãã®ãããã¯åœä»€ã¯ãã¡ãã»ãŒãžãã¥ãŒã«ã¡ãã»ãŒãžãç©ã¿äžãããŸãã ç¹ã«æªãã£ãäŸã¯lhttpcãšããforkã©ã€ãã©ãªã«ããããŠããããŒã«ç®¡çã©ã€ãã©ãªã§ãã ããã¯ãã¹ãã¯ã»ãšãã©éã£ãŠããŸãããæ¥ç¶ã¿ã€ã ã¢ãŠãã10ããªã»ã«ã³ãããããªãããã«èšèšããŠããŸããã ãããæåã®æ°é±éå®ç§ã«çšŒåããããšããããªã¢ãŒããµãŒããããŠã³ããããšãåå ã§ã¯ã©ã€ã¢ã³ããèœã¡ãŸããã ãã®åå ã¯10ããªã»ã«ã³ãåŠçã«ããããšããŠãããã®ãçªç¶å šãŠã®æ¥ç¶ã諊ããªããã°ãªããªããªã£ãããã§ããã ç§é5ããªã»ã«ã³ãçšåºŠã®ãªã¯ãšã¹ãã§9000ã¡ãã»ãŒãž/ç§åŠçããŠãããã®ãäžèšãåå ã§18,000ã¡ãã»ãŒãž/ç§ã®è² è·ãããã æã«è² ããªããªããŸããã ç§ãã¡ãèãã解決çã¯åŒã³åºãåŽã®æ¥ç¶äœæ¥ãæ®ãããŸãŸç®¡çè ããã®äœæ¥ãå®äºããããšåŒ·å¶çã«èªèãããããšã§ããã ãããã¯æäœã¯ã©ã€ãã©ãªã«ãã£ãŠå šãŠã®ãŠãŒã¶ãå©çšå¯èœã«ãªã£ãããã管çè ãããã¹ãããšããªããªãã ä»ã¯ããå€ãã®ãªã¯ãšã¹ããåãå ¥ããããšãã§ããŸãã ã¡ãã»ãŒãžãäžå€®ã§åããšãå¿ èŠããªããªã£ããããæéã®ãããã¿ã¹ã¯ã¯æ¥µåå€ã§ããããã«ãªããŸããã ããã»ã¹ãå¢ããããšã«ãã£ãŠè² è·ãäºæž¬ã§ããïŒãããã¯æäœããããã¡ãªã³ã°æäœïŒãšããã®ã¯ããã¢ã€ãã¢ã§ãã æ¬è³ªçã«åæã«è¡ãå¿ èŠããªããã®ãããã»ã¹ãå¢ãããŠè€éæ§ãçã¿åºããŸãã«ãæ¬åœã«ãããå¿ èŠã確èªããããšãéèŠã§ãã å¥ã®ãªãã·ã§ã³ãšããŠã¿ã¹ã¯ãéåæã®ãã®ã«å€æãããšããããšã§ãããããããèš±ãããã®ã§ããã°ã é·æéãžã§ããéå§ãããããäžæã«èå¥ããããšã§å ã ã®èŠæ±ãåŠçããŸãããªã¯ãšã¹ããå©çšå¯èœã«ãªã£ããšãã ãµãŒãã«åã®ããŒã¯ã³ãšäžç·ã«ãªã£ãŠæ»ãããŸãããµãŒãã¯ã¡ãã»ãŒãžãåä¿¡ããããŒã¯ã³ãšãããã³ã°ãããã ãããã¯ã¿ã€ã ãªãã§èŠæ±ãè¿ãããšãã§ããŸãã ãã®ãªãã·ã§ã³ã¯ããããã®ããã»ã¹ãå©çšããç¹ãšã³ãŒã«ããã¯å°çã«ãªãç¹ã¯ããããã¡ãªããããããŸããã ããå¹ççã«ãªãœãŒã¹ã掻çšããããšãã§ããŸãã
OTPã¢ããªã±ãŒã·ã§ã³ãéçºããŠãããšæ³å®ããŠããªãã¡ãã»ãŒãžãããããšã¯ãŸãã§ãã ãªããªãOTPã¢ããªã±ãŒã·ã§ã³ã¯handle_info/2ã§ãã³ããªã³ã°ãããŠããã®ã§ãäºæããªãã¡ãã»ãŒãžã¯ ããŸãèç©ãããªãã§ããããããããªããOTPæºæ ã·ã¹ãã ãå šãŠã®åäœãå®è£ ããŠãããšã¯éããŸããã ããã¢ãã¿ãªã³ã°ããŒã«ãããã®ã§ããã°ãã©ã®ããã«ã¡ã¢ãªãå¢ããŠããã®ãããã¥ãŒã®ãµã€ãºãèŠãŠ èœã¡ãããªããã»ã¹ãèŠã€ããããšãã§ããŸããããã§å¿ èŠãšãããã¡ãã»ãŒãžããã³ããªã³ã°ããããšã§ åé¡ãä¿®æ£ããããšãã§ããŸãã
å ¥åå¶éã§æãç°¡åãªã®ã¯Erlangã·ã¹ãã äžã®ã¡ãã»ãŒãžãã¥ãŒã®å¶éãè¡ãããšã§ãã ããã¯æãã·ã³ãã«ã§æé©ãããããŸããããŠãŒã¶ã®åããé ãããŠããããšãæå³ããŸãã äžæ¹ã§ãŠãŒã¶ã«ã¯æªãçµéšãäžããããšã«ãªããŸããããŒã¿å ¥åãå¶éããäžè¬çãªæ¹æ³ã¯ åæå¶åŸ¡äžèœãªããã»ã¹åŒã³åºããè¡ãããšã§ããæ¬¡ã®ãªã¯ãšã¹ãã«ç§»ãåã«ã¬ã¹ãã³ã¹ãèŠæ±ããããšã«ããã 察象éšåãé å»¶ããããšãé²ããŸãããã®ã¢ãããŒãã®é£ããéšåã¯ããã«ããã¯ãšãªã£ãŠãããã¥ãŒãã ã·ã¹ãã ã®äžçªå 端ã§ã¯ãªããããæ·±ãæ¢çŽ¢ããããšãããšãã®è¿èŸºã«ããå šãŠã®ãã¥ãŒãæé©åããŠãã æ¢ãå¿ èŠããããŸããããã«ããã¯ã¯äžè¬çã«ããŒã¿ããŒã¹ãããã£ã¹ã¯IO,ãããã¯ãŒã¯äžã®ãµãŒãã¹ãªã©ããããããŸãã ããã¯çµå±åæéšåãããã¯ãšã³ãã«äžæŠåŠçãäŸé ŒããŠçµãããŸã§ãŠãŒã¶ã«"æžéããŠãã ãã"ãšäŒããããšãã§ããŸãã éçºè ã¯ãããã®ãã¿ãŒã³ããŠãŒã¶ããšã®APIå¶éçã«å©çšããŠããŸããããã¯QoSã®ä¿èšŒãå ¬å¹³ãªãªãœãŒã¹ã®äŸçµŠãå¯èœã«ãªããŸãã
ãã®æ¹åŒã§ããªãããŒã®ãªã®ã¯åæåŒã³åºãã§è² è·ãããããéšåãããã¯ãšã³ãã«è¿œãããããšã§ããã ãã®åæäœæ¥ãã©ã®çšåºŠæéãããããã®ãªã®ãã¿ã€ã ã¢ãŠããèšå®ããªããã°ãªããŸããã ãã®åé¡ã衚çŸããäžçªã®æ¹æ³ã¯ã·ã¹ãã ã®å ç«¯ã§æåã®æéãã¯ããŸã£ãŠããããã®æ¬è³ªã®æä»€ãæœãããšã§ãã ããã¯ã¿ã€ããŒãèšç»ããæéåŸ ããªããã°è¡ããªããšããããšãæå³ããŸãã äžçªç°¡åãªã®ã¯åŸ ã¡æéãç¡å¶éã«ããããšã§ããPat Hellandã¯ããã«å¯ŸããŠé¢çœãåçãããŠããŸãã
ããã€ãã®ã¢ããªã±ãŒã·ã§ã³éçºè
ã¯è°è«ããŠã¿ã€ã ã¢ãŠããªãã§åé¡ãªããšãããããããŸããã
ç§ã¯ã¿ã€ã ã¢ãŠãã30幎ã«ããªããææ¡ããŸããããããããšæ¬¡ã
ãšåççãªã¬ã¹ãã³ã¹ãçæãããŸãã
ãªã30幎ãæãã§ç¡å¶éãåççãªã®ã§ãããïŒç§ã¯æªã ã«ç¡å¶éåŸ
ã€ã¡ãã»ãŒãžã³ã°ã¢ããªã±ãŒã·ã§ã³ã«
åºäŒã£ãããšããããŸããã
çµå±ããã¯ã±ãŒã¹ãã€ã±ãŒã¹ã ãšããããŸãããããå€ãã®ã±ãŒã¹ã§ã¯ãããŒå¶åŸ¡ã«éãã¡ã«ããºã ãå©çšããããã« èšèšãã¹ãã§ãããã
ããã¯ãšã³ãã«ãŸãããã·ã³ãã«ãªæ¹åŒãšããŠãããã¯ããŠã»ãããªãœãŒã¹ãäŸãã°æ©ãã§ããªããã®ã ããžãã¹ããŠãŒã¶ã«ã¯ãªãã£ã«ã«ãªãã®ãç¹å®ãããšãããã®ããããŸãããããã®ãªãœãŒã¹ãããã¯ãã éã«ãªã¯ãšã¹ããããããå©çšããæš©å©ãããã確èªãè¡ããŸãã確èªãããã®ãšããŠãCPU,ã¡ã¢ãªãè² è·ã 䞊å床ãã¬ã¹ãã³ã¹æéãªã©ããããããŸããSafetyValveã¢ããªã±ãŒã·ã§ã³ã¯ãããã£ãããŒãºã«ãã£ããã¬ãŒã ã¯ãŒã¯ã§ãã ããã«ã·ã¹ãã ãé害ã«é¢ããŠäœããŠãŒã¹ã±ãŒã¹ã§äœããããã±ãŒã¹ã«å¯ŸããŠããå©çšå¯èœãªåè·¯ããããŸãã äŸãã°ãbreaky, fuse, circuirt_breakerãªã©ããããŸãã ETSãå©çšããã¢ãããã¯ãªã·ã¹ãã ãšãã£ãä»ã®ããŒã«ãå©çšå¯èœã§ããéèŠãªéšåã¯ã·ã¹ãã ã®å 端ã§ãããã¯ããŠããŸããšãã« ããã»ã¹ãããŒã¿ã«ã¢ã¯ã»ã¹ããæš©å©ãããã確èªããã®ã§ãããã³ãŒãã®æ¬è³ªçãªããã«ããã¯ã¯æš©å©ããããã©ãã 確èªããéšåã«ãªããŸãããã®æ¹åŒã§é²ãã§ããããšã®ã¡ãªããã¯ã¿ã€ããŒãåæã¬ã€ã€ãŒã®æœè±¡åãè€éã«ããªããŠããç¹ã§ãã ããªãã¯ããã«ããã¯ãå®ãããšããžãå¶åŸ¡ç¹ãå šãŠã«ãããŠèªã¿ããããã®ãåºæ¥äžãããŸãã
ãã³ã¯ãšã³ãã®ããªãããŒãªéšåã«ã€ããŠããã§èª¬æããŸããåæåŒã³åºããéããŠæé»çã«ããã¯ãšã³ãã«ãŸãããåŠçã å®äºãããšããè² è·ãå®éã«ã©ãã«ãããŠãããç¥ãå¯äžã®æ¹æ³ã¯ã·ã¹ãã ãé ããªã£ãŠããå Žé¢ã§ããæ²ããããšã«ã 匱ãããŒããŠã§ã¢ã匱ããããã¯ãŒã¯ãé¢é£ã®ãªãå Žé¢ã§ã®è² è·ãäœéã®ã¯ã©ã€ã¢ã³ããªã©æ§ã ãªããšãèããããŸãã ã·ã¹ãã ãããã¯ãšã³ãã«åŠçãé©çšããéã«ããèªèº«ã®å¿çæ§ãèšæž¬ããããšã¯ç±ãæã£ã人ã蚺æããã®ãšå矩ã§ãã ãããŠäœãééã£ãŠããªããã衚瀺ããŸãã
蚺å¯ã®ããã®æš©éã確èªãããšãããªãã«æç¢ºãªã¬ããŒããéããããã€ã³ã¿ãã§ãŒã¹ãå®çŸ©ããŸãã ã·ã¹ãã å šäœãšããŠè² è·ãé«ãå Žåããæä»€ã®ãªãã§ã©ããã®å¶éã«ã²ã£ããã£ãŠããå Žåãç¥ãããšãã§ããã ã·ã¹ãã ãèšèšããéã«è¡ãã¹ãéžæããããŸãããŠãŒã¶ã¯ãŠãŒã¶ããšã«å¶éããã£ãŠããŸããïŒãããšã ã·ã¹ãã å šäœãšããŠå¶éããã£ãŠããŸããïŒ ã·ã¹ãã å šäœãšããŠå¶éããã€ãããŒãããšã«å¶éãæã€ãã©ã¡ãã«ããŠãå®è£ ã¯ç°¡åã§ããããããã©ã¡ããã«åããš äžå ¬å¹³ã«ãªããããããŸããã90%ã®ãªã¯ãšã¹ãããããŠãããŠãŒã¶ããããšããŠããã®ãŠãŒã¶ã¯ä»ã®å€§å€æ°ã®ãŠãŒã¶ã®ããã§ ãã©ãããã©ãŒã ãå©çšã§ããªããããããŸããã ãŠãŒã¶ããšã«å¶éãæã€ãšãå ¬å¹³ã§ãããã¬ãã¢ã ãŠãŒã¶ã§å¶éããªãããšãã察å¿ãå¯èœã§ããããã¯åçŽã«ããããšã§ããã ããå€ãã®ãŠãŒã¶ã«å©çšããŠãããããã«ã¯ããå¹ççãªã·ã¹ãã å šäœã§ã®å¶åŸ¡ãæ€èšããå¿ èŠããããŸãã 100ãŠãŒã¶ã§ã¯ãããŠäžåéã§100ãªã¯ãšã¹ããå¶éãšããå Žåæå€§ã§äžåéã«10,000åãªã¯ãšã¹ããããããšã«ãªããŸãã 20ãŠãŒã¶åæ§ã®æ¡ä»¶ã§è¿œå ãããšãã¡ãŸã¡ã¯ã©ãã·ã¥ããŠããŸããããããŸããã ãŠãŒã¶ãå¢ããŠãããšããã ããšã©ãŒãèµ·ããããå¯èœæ§ãå¢ããŠããŸããããžãã¹çã«èš±å®¹ã§ãããã¬ãŒããªããèæ ®ãã ãã€ã³ãã¯éèŠã§ããããŠãŒã¶ã¯ã·ã¹ãã å šäœãäžå®æéèœã¡ãŠããã ããããäžæ¥äžèœã¡ãŠããããšã«äžæºãæã€ åŸåããããŸãã
Erlangã·ã¹ãã ã®å€åŽã§é ããªã£ãŠããããã¹ã±ãŒã«ã¢ããã§ããªããšãããªãã¯ããŒã¿ãæšãŠããã¯ã©ãã·ã¥ãããå¿ èŠããããŸãã ããã¯æ²ããçŸå®ã§ãããã以å€ã®å¯Ÿå¿æ¹æ³ã¯é£ããã§ããããã°ã©ãããœãããŠã§ã¢ãšã³ãžãã¢ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ãã£ã¹ã㯠䜿ã£ãŠããªãããŒã¿ãåãèœãšãã䜿ããããããã«ä¿ã¡ãŸãã諊ããã«æé©åãç¶ããŠæ£åžžãªç¶æ ã«ããŸãã ããããªãããããããŒã¿ãåºãŠè¡ãããå ¥ã£ãŠããæ¹ãæ©ãå Žåã Erlangã·ã¹ãã ããããååã«å¯Ÿå¿ã§ããã倿ãã¹ããã€ã³ãã«ãªããŸããããã¯afterãšããã³ã³ããŒãã³ãã§åŠçããŸãã ããããªããããŒã¿ãå ¥ã£ãŠããå¶éãæã£ãŠããªãå Žåã¯ã©ãã·ã¥ããªãããã«ããŒã¿ã廿£ããå¿ èŠããããŸãã
ã©ã³ãã ã«ããŒã¿ãæšãŠãããšãæãç°¡åã§ã·ã³ãã«ã«ä¿ã€ããšãã§ããŸãã ããªãã¯ãšããŠã¯äŸãã°0ãã1ã®éã®æ°åã¯æšãŠããšè¡ã£ããããå€ã«ãããã®ã§ãã
-module(drop).
-export([random/1]).
random(Rate) ->
maybe_seed(),
random:uniform() =< Rate.
maybe_seed() ->
case get(random_seed) of
undefined -> random:seed(erlang:now());
{X,X,X} -> random:seed(erlang:now());
_ -> ok
end.
ããã¡ãã»ãŒãžã®95%ãä¿æãããã®ã§ããã°ãèªèšŒã¯case drop:random(0.95) of true -> send(); false -> drop() endã åŒã³ãŸããïŒãããã¯drop:random(0.95) andalso send()ïŒããã¯ç¹ã«ã¡ãã»ãŒãžã®åé€ã«äœãæå³ãæãããªãå Žåã§ãã maybee_seed颿°ã¯ããã»ã¹ã®äžã§seedãæ€èšŒãããå€ãããã ãªããã®ã«ãªã£ãŠããªããæ€èšŒããŠããŸãã ãŸããè€æ°ånow颿°ãåŒã°ããã®ããããç®çã§ãå©çšãããŠããŸãã ãã®ã¡ãœãããã1ã€ããã£ãããšããããŸããã©ã³ãã ããããã¯çæ³çã«ã¯ãã¥ãŒã¬ãã«ã§ã¯ãªãProducerã¬ãã«ã§ å®è¡ãããã¹ãã§ãããã¥ãŒã®è² è·ããããããã«ã¯æåã®å ŽæããããŒã¿ãéããªãæ¹æ³ã§ãã ãªããªãErlangã«ã¯éããããã¡ãŒã«ããã¯ã¹ã¯ãªãã®ã§ä¿èšŒãããåä¿¡ããã»ã¹ã®ã¿æšãŠãããã«ããŸãã ãã®ããã»ã¹ã¯ä¹±æŽã«åäœããŠãããã®ã§ã倧éã®ã¡ãã»ãŒãžãåãé€ãããã«ããŠãæ£åžžã«åäœãããããã€ãšããŸãã
äžæ¹ã§ãProducerã¬ãã«ã§ã®å»æ£ã¯å šãŠã®ããã»ã¹éã§å ±æã§ããå¿ èŠããããŸãã ããã¯é¢çœãå Žæã§æé©åãè¡ãããŸããETSã®ããŒãã«ãapplication/set_envãå©çšããŠãããå€ãèšå®ããã®ã§ãã ããã«ãã£ãŠè² è·ãããŒã¹ã«å»æ£ãã¹ãã¡ãã»ãŒãžãã³ã³ãããŒã«ã§ããèšå®ããŒã¿ã«ã€ããŠã¯application:get_env/2ãå©çšããŸãã äžèšã®æè¡ãå¿çšãããšConsumerã¬ãã«ã§ã¯ãªãã¡ãã»ãŒãžã®åªå é äœã§å»æ£ãã¹ãå²åãèšå®ã§ããŸãã
ãã¥ãŒãããã¡ã¯ã©ã³ãã 廿£ã§ã¯ãªãæ¹æ³ã§ã¡ãã»ãŒãžãã³ã³ãããŒã«ããæ¹æ³ãšããŠããæ¹æ³ã§ãã ç¹ã«ã³ã³ã³ã¹ã¿ã³ãã«ã¯ãã£ãŠããç·åœ¢ã¹ããªãŒãã³ã°ããŒã¿ã§ã¯ãªãå ¥åããŒã¿ã®è² è·ãæ°ã«ãªããšãã«æå¹ã§ãã ããã»ã¹ããã¥ãŒã®åœ¢ãæã£ãã¡ãŒã«ããã¯ã¹ã§ããã«ãé¢ããããããªãã¯å šãŠã®ã¡ãã»ãŒãžãåä¿¡ããããšãã§ããŸãã ãã¥ãŒãããã¡ã¯å®å šã«åäœãããããïŒã€ã®ããã»ã¹ãå¿ èŠãšããŸãã
ãããåäœãããããã«ããããã¡ããã»ã¹ã¯ã¡ãŒã«ããã¯ã¹ããããŒã¿ãåãé€ããŠããã¥ãŒã«ããŒã¿ããããŸãã ãã€ã§ããµãŒããåäœã§ããããã«ãªã£ãŠããããããã¡ããã»ã¹ã«ããã€ã®ã¡ãã»ãŒãžãããŠããã確èªã§ããŸãã ãããã¡ããã»ã¹ã¯ãã¥ãŒããåãåºããŠãµãŒãã«ããããããŒã¿ãèç©ããŸãã ãã¥ãŒã«ããŒã¿ãããŠæ°ããã¡ãã»ãŒãžãåãåããããã«ãªãã°ããªãã¯ããŒã¿ãåãåºããŠæ°ãããšãã«ããããšãã§ããŸãã å¿ èŠã§ããã°å€ãã¡ãã»ãŒãžã¯åé€ãã§ãããæ®ããŠããããšãã§ããŸãã ããã§ãªã³ã°ãããã¡ã®ããã«å®å®ããåä¿¡æ°ã®ã¡ãã»ãŒãžãç¶æãããã€è² è·ã«å¯Ÿããèæ§ãå¿ èŠã§ãã PO Boxã代衚çãªã©ã€ãã©ãªã§ãã
ã¹ã¿ãã¯ãããã¡ã¯ãã¥ãŒãããã¡ãå¶åŸ¡ããã®ã«äŸ¿å©ã§ãããé å»¶ãããŸããªãèŠä»¶ãéèŠã§ããããšãæèããŠãã ããã ãããã¡ãã¹ã¿ãã¯ãšããŠå©çšããå Žåã2ã€ã®ããã»ã¹ãå¿ èŠã§ãäžã€ã¯ãã¥ãŒãããã¡ãšããäžã€ã¯ ãã¥ãŒãããã¡ããªã¹ããšããŠæ±ãããã®ããã»ã¹ã§ãã ã¹ã¿ãã¯ãããã¡ãäœã¬ã€ãã³ã·ã§ç¹ã«åã°ããã®ã¯ãããã¡ãããŒãã«é¢é£ãããã®ã§ãã ãããã¥ãŒã«å ¥ã£ãã¡ãã»ãŒãžã®äžã§ããã€ãé å»¶ãçºçãããšããã¥ãŒã«ããå šãŠã®ã¡ãã»ãŒãžãæ°ããªç§é å»¶ããŸãã çµå±ãã¡ãã»ãŒãžã®é®®åºŠã¯æªããªã廿£ã®å¯Ÿè±¡ã«ãªããŸããäžæ¹ã§ã¹ã¿ãã¯ã«ããããšã§æ°ãããã®ãæééããµãŒãã«éããªãã å¶éãããåæ°ã®èŠçŽ ã®ã¿ææããããšãå¯èœã«ãªããŸãã ããªãã¯ã¹ã¿ãã¯ã確èªããªããQoSã«å¿ããŠã¹ã¿ãã¯ã管çããããšãã§ããŸããPO Boxãããã«ã«ãå®è£ ã«ãªã£ãŠããŸãã ã¹ã¿ãã¯ãããã¡ã®æ¬ ç¹ã¯å¿ ãããéãããŠããé çªã«åŠçããå¿ èŠããªããšããããšã§ãã ãããããç¬ç«ã®ã¿ã¹ã¯ãšãªã£ãŠããå Žåã¯ããã®ã§ãããé£ç¶ãããã®ãäžã€ã®ã¿ã¹ã¯ãšããŠãªã£ãŠããå Žåã ç¡é§ãªã¿ã¹ã¯ãæ®ã£ãŠããŸãå¯èœæ§ããããŸãã
ããããªããå€ãããã€ãã³ãã®åã«å€ãã€ãã³ãã察å¿ããªããšãããªãå Žåãããããè€éãªæ§æã«ãªãã æ¯åã¹ã¿ãã¯ã確èªããªããšãããªããªãã®ã§ãã³ã³ã¹ã¿ã³ãã«ã¹ã¿ãã¯ãåé€ããã®ãéåžžã«éå¹çã«ãªããŸãã é¢çœãã¢ãããŒãã¯è€æ°ã®ã¹ã¿ãã¯ããã£ããã±ãããçšæããŠã¹ã¿ãã¯éãæéã§ç®¡çãããšããæ¹æ³ã§ãã ããQoSã«æºããªãã¹ã¿ãã¯ãããã°æéãåç §ããŠã¹ã¿ãã¯å šäœãåé€ããã°ããã®ã§ãã ããã¯äžéšã®ã¡ãªããã«å¯ŸããŠå€ãã®ãã¡ãªãããããããã«æããããããŸãããããšã«ããã¡ãã»ãŒãžãåé€ãããšãã« äœã¬ã€ãã³ã·ã§è¡ãããå Žåã¯éåžžã«å¥œãŸããæ¹æ³ã«ãªããŸãã
宿çãªè² è·ãæ±ãããã®æ°ãã解決çãå¿ èŠã«ãªããããããŸããããã¥ãŒãšãããã¡ãŒã¯æã èµ·ããè² è·ã«å¯ŸããŠ çžæ§ãããã§ãããããŠãããã¯å ¥åã«å¯ŸããŠè¿œãã€ãããããªãšãã«ä¿¡é Œæ§ãæã£ãŠåŠçãã§ããŸãã ãããã£ãå Žåããããã®ã¡ãã»ãŒãžãäžã€ã®ããã»ã¹ã«éäžãããšåé¡ãçºçããŸãã ãã®å ŽåïŒã€ã®ããã¢ãããŒãããããŸãã
ETSããŒãã«ã¯ããã»ã¹ãã倿°ã®ãªã¯ãšã¹ããæãããšãã§ããŸãããETSããŒãã«ããµããŒãããŠããåäœã¯ ããåºæ¬çãªãã®ã®ã¿ã§ããäžè²«ããã«ãŠã³ã¿ãã远å ãåé€ãåçŽãªèªã¿èŸŒã¿ã¯åäœå¯èœã§ãã ETSããŒãã«ã¯2ã€ã®ã¢ãããŒããå¿ èŠãšããŸãã äžè¬çã«ã¯ãªãããã®ã¯æåã®æ¡ä»¶ã¯æ®éã®ããã»ã¹ãšããŠããŸãåäœããããšã§ãã Nåã®ããã»ã¹ããããŠããããã«ååãã€ããŠãã©ãããéžãã§ã¡ãã»ãŒãžãæããããšãã§ããããã«ããŸãã è² è·ãæ³å®ããŠã€ãã³ãã忣ãããŠã©ã³ãã ã«ããã»ã¹ãéžæãããã€ä¿¡é Œæ§ãå¿ èŠãšãããŸãã ç¶æ ãæããªãã³ãã¥ãã±ãŒã·ã§ã³ãå¿ èŠãªã®ã§ããã°ãäœæ¥ã¯ã»ãŒåãæ¹æ³ã§å ±æããã倱æã«å¯ŸããŠéæã«ãªããŸãã çµéšçã«ç§ã¯åçã«atomãäœæããããšãé¿ããŠããŠãETSããŒãã«ã®read_concurrencyãtrueã«ã»ããããããšã§workerã« å ±æããæ¹åŒã奜ãã§ããŸããããã¯åãããšããã¡ããã§ããåŸã§ããã€ãã®æŽæ°ãè¡ãéã«äŸ¿å©ã ããã§ãã 䌌ããããªæ¹åŒãšããŠlhttpcã©ã€ãã©ãªãå©çšããŠãã¡ã€ã³ãåºæ¬ãšããããŒããã©ã³ã¹æ§æãæ¡ãããšãã§ããŸãã
äºã€ç®ã®æ¡ä»¶ã¯ããã¯ãšã«ãŠã³ã¿ãŒã䜿ããŸãããåºæ¬çãªæ§æã¯æ®ããŠãå®éã«ã¡ãã»ãŒãžãéãåã« ETSããŒãã«ãæŽæ°ã§ããããã«ããŠããããšã§ããå šãŠã®ã¯ã©ã€ã¢ã³ããå ±æããã®ã«å¶éãããã®ã¯ããç¥ãããŠããŸãã ããã»ã¹ãäœæãããªã¯ãšã¹ãã¯ãã®å¶éãã¯ãªã¢ããããã«ããŸãã ãã®ã¢ãããŒãã¯ã¡ãã»ãŒãžãã¥ãŒãé¿ããããã«dispcountãå©çšãããŠããŸãããããŠããã¯ãªã¯ãšã¹ããæåŠãããŠã åŸ ããªããŠããããã«äœã¬ã€ãã³ã·ãä¿èšŒããäžã§å®çŸããããšãã§ããŸãã ãã®åŸã©ã€ãã©ãªåŽã§ãã諊ããã®ãå¥ã®ã¯ãŒã«ãŒã§è©Šãã®ãå®è£ ããŸãã
ãããŸã§ã®ã»ãšãã©ã®è§£æ±ºçã¯ã¡ãã»ãŒãžã®éãããŒã¹ã«ããŠèããŠããŸãããã ã¡ãã»ãŒãžãµã€ãºããè€éæ§ããããã¯ããªtãææšãšãããäœããããŒã¹ã«èããããšãã§ããŸãã ãã¥ãŒãã¹ã¿ãã¯ãããã¡ãå©çšãããšãã¯ããšã³ããªã®æ°ãæ°ããã®ã§ã¯ãªããã¡ãã»ãŒãžãµã€ãºã è² è·ããã§ãã¯ããå¿ èŠããããããããŸããã ç§ãçµéšäžèããã®ã¯ã¡ãã»ãŒãžã®è©³çްãèæ ®ããã«æšãŠãã®ã§ã¯ãªãã åã¢ããªã±ãŒã·ã§ã³ãåãå ¥ãããã©ãã倿ããç¬èªã®ãã€ã³ããæã£ãŠããŸãã ãã¡ããããã«ã¯ããŒã¿ãããªãã«éã£ãŠ"fire-and-forget"ã«åŸã£ãæ¹æ³ã§å¯Ÿå¿ããããšãå¯èœã§ã ïŒã·ã¹ãã å šäœãéåæãã€ãã©ã€ã³ã®äžéšã ãšèããïŒãããã®æ¹æ³ã ãšãªãããŒã¿ãæšãŠãããã®ã ãšã³ããŠãŒã¶åãã®èª¬æãé£ãããªããŸããããããªãã廿£ããã¡ãã»ãŒãžãéããŠã"Yåã®ã¡ãã»ãŒãžãç Žæ£ãããŸããã çç±ã¯Xã§ã"ãšããã®ã§ããã°ããŠãŒã¶ã®çè§£ãåŸããããªããŸãã ãã®å ŽåHerokuã®logprexæ©èœãæ¡çšããããšã«ãªãããšããããŸããããã¯ã«ãŒãã£ã³ã°ã«é¢ããã·ã¹ãã ã§ L10 errorsãåãåºãããšãã§ããŸãããããå©çšããããšã§ã·ã¹ãã ã®äžéšãå šãŠã®ã¡ãã»ãŒãžãæ±ãããšãã§ããªãããšã ãŠãŒã¶ã«äŒããããšãã§ããŸãã
æåŸã«è² è·ããããšãã«åãå ¥ãããããã©ããã«ã€ããŠã¯ã·ã¹ãã ãå©çšãããŠãŒã¶ã«äŸåããåŸåããããŸãã æ°ããæè¡ãéçºããããèŠä»¶ã¯ç°¡åã§å°ãã®å€æŽã§å¯èœãªå Žåãå€ãã§ããã ãšãã©ãããã ãã§ã¯å¯Ÿå¿ã§ããªãããšããããŸãã
å®è¡äžã®ãµãŒããšå¯Ÿè©±ããå Žåãåºæ¬çã«æ¬¡ã®ããããã®æ¹æ³ã§ãããªãããŸãã äžã€ã¯screenãtmuxãå©çšããŠããã¯ã°ã©ãŠã³ãã§èµ·åããŠããã·ã§ã«ãå©çšå¯èœãªç¶æ ã«ããŠããããšã§ãã ããäžã€ã¯é¢æ°ãå æ¬çãªèšå®ãã¡ã€ã«ãåèªã¿èŸŒã¿ãããæ¹æ³ã§ãã åçãªã»ãã·ã§ã³ã§å¯Ÿè©±ããå ŽåREPL圢åŒã§åäœããŠããã°äžè¬çã«ã¯ã¢ã¯ã»ã¹å¯èœã§ãã ããã°ã©ã ãèšå®ãã¡ã€ã«ã§ç®¡çããŠããå Žåãæ éã«æ€èšããå¿ èŠããããäœããããã®ã ã¯ã£ããããããŠããã¢ã¯ã»ã¹ããå¿ èŠããããŸããåŸè ã®æ¹æ³ã¯å šãŠã®ã·ã¹ãã ã§å©çšå¯èœãªã¯ãã§ãã®ã§ ä»åã¯ãããäœãäžããã®ãã«ã€ããŠã¯ã¹ãããããŸãã Erlangã®å ŽåREPLããããå°ã"åç"ã«è¿ãæ¹åŒããšããŸããåºæ¬çã«ErlangVMã¯REPLãå¿ èŠãšããŠãããã ãã€ãã³ãŒããå®è¡ããŠåäœãããã®ã§ãã·ã§ã«ã¯å¿ èŠãããŸããã ãããErlangãã©ã®ããã«äžŠåã«ãã«ãããã»ã¹ã§åäœããã®ãããããŠåæ£ã®ããã«ã©ã®ãããªãµããŒãã ããŠãããç¥ãããã«ä»»æã®Erlangããã»ã¹ã«å¯ŸããŠREPL圢åŒã§ã¢ã¯ã»ã¹å¯èœã§ãã Erlangã§ã¯äžã€ã®screenã«äžã€ã®shellãšãã圢åŒã§ã¯ãªããäžåºŠã«è€æ°ã®ErlangVMäžã«ååšãã è€æ°ã®æ¥ç¶ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã åºæ¬çã«åæã«äºã€ã®æ¥ç¶ã«ã¢ã¯ã»ã¹ããå Žåã¯cookieãããŒã¹ã«ã¢ã¯ã»ã¹ããŸããããããå«ãŸããŠããªã ã±ãŒã¹ã§ãã¢ã¯ã»ã¹ããããšã¯å¯èœã§ãã ãã®å ŽåããŒãã®ååãããšã«ãããã®ããŒãã«äºåã«ã¢ã¯ã»ã¹ã§ããããšã 確èªããŠããå¿ èŠããããŸããïŒprior measureïŒ
ãžã§ãå¶åŸ¡ã¢ãŒãïŒJCLã¢ãŒãïŒã¯Erlangã·ã§ã«äžã§^GãæŒãããšã§åãæ¿ããããŸãã ã¡ãã¥ãŒãããªã¢ãŒãã·ã§ã«ã«ã¢ã¯ã»ã¹ããããã®ãªãã·ã§ã³ãéžã¹ãŸãã
([email protected])1>
User switch command
--> h
c [nn] - connect to job
i [nn] - interrupt job
k [nn] - kill job
j - list all jobs
s [shell] - start local shell
r [node [shell]] - start remote shell
q - quit erlang
? | h - this message
--> r â[email protected]â
--> c
Eshell Vx.x.x (abort with ^G)
([email protected])1>
äžèšã³ãã³ããçºè¡ãããšãè¡ãç·šéãããŠãªã¢ãŒãã·ã§ã«ãšããŠæ©èœããããã«ãªããŸãã å šãŠã®åºåã¯ãªã¢ãŒãå ã®åºåãããŒã«ã«äžã«è¡šç€ºãããŸãã ã·ã§ã«ãæããŠJCLã¢ãŒãã«ãã©ãã«ã¯^GãæŒããŸããããŒã«ã«ã·ã§ã«ããæããããã«ã¯ ^G qãã¿ã€ãããŸãã
([email protected])1>
User switch command
--> q
èªåçã«ã¯ã©ã¹ã¿å šäœã«æ¥ç¶ããªãããã«hiddenã¢ãŒãã§æ¥ç¶ããæ¹ããããããããŸããã
ãã®ã¡ã«ããºã ã¯JCLã¢ãŒãã«äŒŒãŠããŸãããçšæ³ãéããŸãã å šäœã®JCLã¢ãŒãã«ã¢ã¯ã»ã¹ããããã«ã¯ä»¥äžã®ããã«ã¢ã¯ã»ã¹ããŸãã
erl -name [email protected] -remsh [email protected]
ããã¯ççž®çã§ãã
erl -sname local@domain -remsh remote@domain
ãã®ä»ã®Erlangã®ãªãã·ã§ã³ãæ€èšŒãããŸãã JCLã¢ãŒãã§åããŠãããã®ãšã¡ã«ããºã ã¯åãã§ãããæåãããªã¢ãŒãã·ã§ã«ã« ã¢ã¯ã»ã¹ã§ããŠãããšãããéããŸãã^Gãå®å šã«æããããæ¹æ³ã§ãã
Erlang/OTPã¯SSHå®è£ ãåèãããŠããŠããã¯ãµãŒãã«ãã¯ã©ã€ã¢ã³ãã«ããªãããšãã§ããŸãã ãã®ãã¢ã¢ããªã±ãŒã·ã§ã³ã¯Erlangã®ãªã¢ãŒãã·ã§ã«ã§åäœããŠããŸãã ãããåäœãããããã«ãSSHã®ããŒãçšæããŠããå¿ èŠãããã®ã§ããã¹ãçšã«ä»¥äžã®ããã«èšå®ããŠãããŸãã
$ mkdir /tmp/ssh
$ ssh-keygen -t rsa -f /tmp/ssh/ssh_host_rsa_key
$ ssh-keygen -t rsa1 -f /tmp/ssh/ssh_host_key
$ ssh-keygen -t dsa -f /tmp/ssh/ssh_host_dsa_key
$ erl
1> application:ensure_all_started(ssh).
{ok,[crypto,asn1,public_key,ssh]}
2> ssh:daemon(8989, [{system_dir, "/tmp/ssh"},
2> {user_dir, "/home/ferd/.ssh"}]).
{ok,<0.52.0>}
ç§ã¯ããã§ããã€ãã®ãªãã·ã§ã³ãèšå®ããŠããŸããsystem_dirã¯hostãã¡ã€ã«ãã©ãã«ããã®ãæå®ããŠããŸãã user_dirã§èšå®ãã¡ã€ã«ã®å Žæãæå®ããŠããŸããç¹å¥ãªãã¹ã¯ãŒããå ¬éããŒã®æå®ããªãã·ã§ã³ã§èšå®å¯èœã§ãã SSHããŒã¢ã³ãä»ããŠæ¥ç¶ããå Žå以äžã®ããã«æ¥ç¶ããŸãã
$ ssh -p 8989 [email protected]
Eshell Vx.x.x (abort with ^G)
1>
ããããããšã§çŸåšã®ããŒãã«Erlangãã€ã³ã¹ããŒã«ããããšãªãã¢ã¯ã»ã¹ãã§ããŸãã æ¥ç¶ãåããšãã¯SSHã®æ¥ç¶ãåãã ãã§å€§äžå€«ã§ããq()ãinit:stop()颿°ãå®è¡ãããš ãªã¢ãŒãå ã忢ããŠããŸãã®ã§æ°ãã€ããŠãã ããã ããæ¥ç¶ã§å°ã£ãå Žåã-oLogLevel=DEBUGãã€ããŠå®è¡ãããšSSHæ¥ç¶ãããã°ã®åºåã衚瀺ãããŸãã
ããŸãç¥ãããŠããªãæ¹æ³ãšããŠæç€ºçã«åæ£ãæå®ããŠãªãErlangããŒãã«å¯ŸããŠååä»ãããããã€ãã éããŠæ¥ç¶ããããšãã§ããŸããããã¯run_erlãšããååä»ããã€ããã©ããããã³ãã³ãã§ã¢ã¯ã»ã¹ã§ããŸãã
$ run_erl /tmp/erl_pipe /tmp/log_dir "erl"
æåã®åŒæ°ãååä»ããã€ããå©çšãããã¡ã€ã«ã§ããäºã€ç®ã®åŒæ°ããã°ãã¯ããã£ã¬ã¯ããªã§ãã ããŒãã«æ¥ç¶ããããã«ã¯to_erlãå©çšããŸãã
$ to_erl /tmp/erl_pipe
Attaching to /tmp/erl_pipe (^D to exit)
1>
ããã§ã·ã§ã«ãæ¥ç¶ãããŸãã`æãããšãã¯^Dãã¿ã€ãããŸãã
ErlangVMãæ¬çªç°å¢ã§å©çšããããšã®äžã€ã®ã»ãŒã«ã¹ãã€ã³ãã¯ééçã«å®è¡æã®äžèº«ã ãããã°ããããã¡ã€ã«ãåæãã§ããããšã§ãã ããã°ã©ã ãå©çšããŠã¢ã¯ã»ã¹ã§ããããšã®ã¡ãªããã¯ããããå©çšããããŒã«ãç°¡åã«äœããã®ã§ã ã¿ã¹ã¯ãç£èŠããŒã«ãäœãã®ãç°¡åã ãšããããšã§ããå¿ èŠãªãšãã«VMã®æ å ±ãé²èЧããããšãã§ããã®ã§ãã
çµéšçãªã¢ãããŒãã§ã¯æé·ããŠããã·ã¹ãã ãå¥åº·çãªç¶æ ã«ä¿ã€ããã«ã¯å šãŠã®èŠç¹ã§ç£èŠã§ããããšãéèŠã§ãã ãããæ®éãããåºãªãããšããã¢ããã€ã¹ã¯äžè¬çã«ã¯ãããŸãããããªãã¯éåžžã®ç¶æ ãç¥ãããã«ããæé垯㮠ããããã®ããŒã¿ã欲ããã§ããããäœæ¥ããã£ãŠå¿ èŠãªæ å ±ãéããããšãã§ãããããããOFFã«ããŠå¯ŸçãããŠãããšãã§ããŸãã ãã®ç« ã§ã¯æ®éã®OTPã¢ããªã±ãŒã·ã§ã³ã«ã©ã®ããã«ã¢ã¯ã»ã¹ã§ããã®ãèŠããããšããããŸãã ããããå šãŠã®ç¹åŸŽãäžã«æã«ããããã§ã¯ãªãã§ãããæ¬çªã·ã¹ãã ã§èªèº«ã§ç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã ãããã¯äŸ¿å©ãªããŒã«ãšããããã¯ãããã¯ãæ§ç¯ãããšããã»ããè¿ããããããŸããã åºæ¬çãªããŒã«ã¯reconã©ã€ãã©ãªã«ãŸãšããããŠããŠããã¹ãã®ãã€ã©ã€ãã䟿å©ãªãªãã¬ãŒã·ã§ã³ããŸãšãŸã£ãŠããŸãã
倧ããæå³ã§VMã®äžèº«ãã¿ãããšãããšãã³ãŒããèµ°ã£ãŠãããã©ããã¯é¢ä¿ãªããçµ±èšæ å ±ãéããã®ã圹ç«ã¡ãŸãã ãã¡ããããªãã®çããé·ãæéã®æ å ±ååŸã ãšãããšãäžé±éããããå°æéã®ãŠã£ã³ããŠãæ€åºã§ããªããšãã£ãŠ åé¡ãããã£ãŠããŸããã¡ã¢ãªãããã»ã¹ãªãŒã¯å«ããããã®é·ãæéãžã®ãã察å¿ãšããŠã¯ããŸãããŒã¿ãååŸã㊠æ¥åäœãé±åäœã®æŽ»åã®ãªãã§ã©ããã£ãããšãçºçãããæ°ã¶æç¢ºä¿¡ã§ãããŸã§èŠæ¥µããããšã§ãã ãããã£ãã±ãŒã¹ã§Erlangã®èšæž¬ããŒã«ã¯äŸ¿å©ã§ãã以äžã«ãªãã·ã§ã³ããããŸãã
ããããããªãã®ç®çã«ãã£ãŠå¿ èŠãªæ å ±ãååŸããããšããããšããããŸãã
VMäžã®ã¡ã¢ãªã調ã¹ãå Žåã¯erlang:memory()ãå©çšããŸãã
1> erlang:memory().
[{total,13772400},
{processes,4390232},
{processes_used,4390112},
{system,9382168},
{atom,194289},
{atom_used,173419},
{binary,979264},
{code,4026603},
{ets,305920}]
ããã«ã¯ããã€ãã®èª¬æãå¿ èŠã§ãã åäœã¯å šãŠãã€ãã§è¿ããå²ãåœãŠãããŠããã¡ã¢ãªãè¿ããŸãã ããã¯åŸã§èŠãŠã¿ãŸããOSãå²ãåœãŠããã®ããå°ãå°ããå€ã«ãªããŸãã totalãã£ãŒã«ãã¯ããã»ã¹ãšã·ã¹ãã ãå©çšããŠããã¡ã¢ãªã®åèšã«ãªããŸãã processesã¯Erlangã®ããã»ã¹ãå©çšããŠããã¡ã¢ãªããsystemã¯ã·ã¹ãã ã§å©çšããŠããã¡ã¢ãªã«ãªããŸãã æ®ãã¯ETSããŒãã«ãšVMã§å©çšããŠããã¡ã¢ãªã®äžèЧã§ä»ã®é ããã£ãŒã«ãã«ã€ããŠã¯èª¬æããŸããã ããããªããVMå šäœã®ã¡ã¢ãªéãç¥ãããã®ã§ããã°ãæ¬åœã®æå€§å€ã§ã¯ulimitã§ååŸã§ããå€ã§ããã æ£ç¢ºã«ã¯VMã®äžã§ååŸããããšã¯é£ããã§ãã ããããããå Žåã¯topãhtopãå©çšããŠååŸããããšãã§ããŸãã幞éã«ãrecon_alloc:memory/1ã§ååŸå¯èœã§ãã åŒæ°ã¯ä»¥äžã«ãªããŸãã
ãããã®è¿œå ãªãã·ã§ã³ãæå®å¯èœã§ãããããŠ7ç« ã§å©çšããã¡ã¢ãªãªãŒã¯ã«ã€ããŠãå¿ èŠã«ãªããšããããŸãã
äžå¹žã«ãErlangéçºè ã«ãšã£ãŠCPUããããã¡ã€ã«ããã®ã¯é£ããã§ããçç±ã¯ä»¥äžã®éãã§ãã
ãããã®èŠçŽ ã«ãããå®éã«ããããŠããCPUãç¥ãããšã¯é£ããã§ããErlangãå ±éçã«å©çšãã CPUããããŸããå®éã«ããããã®å®äœæ¥ãã¯ãããšCPUã¯ããã«å©çšããããšã«ãªããŸãã æãæ£ç¢ºã«ããŒã¿ãç¥ããã®ãã¹ã±ãžã¥ãŒã©ã®ãŠã©ãŒã«ã¿ã€ã ã§ããããã¯ãªãã·ã§ã³ã§å®è¡ã§ãã çµ±èšã§ããŒãäžã§æã§å®è¡ãããšãããã宿ééã§ååŸããŸãã ããã¯Erlangããã»ã¹ãå®éã«åäœããŠããæéã瀺ããŸãã NIFs, BIFs, garbage collectionãªã©ã察象ã«ãªããŸãã ããã¯CPUå©çšçãšãããããã¯ã¹ã±ãžã¥ãŒã©å©çšçã®å€ãšããã»ããæ£ããã§ãã Erlang/OTPãªãã¡ã¬ã³ã¹ããã¥ã¢ã«ã§åºæ¬çãªäœ¿ãããã¯æžããŠãããŸããããã§ã¯reconã䜿ã£ãŠååŸããŠã¿ãŸãã
1> recon:scheduler_usage(1000).
[{1,0.9919596133421669},
{2,0.9369579039389054},
{3,1.9294092120138725e-5},
{4,1.2087551402238991e-5}]
recon:scheduler_usage(N)ã¯Nããªç§ééã§ããŒã¿ãååŸããåã¹ã±ãžã¥ãŒã©ã®å©çšæéãåºåããŸãã ãã®ã±ãŒã¹ã§ã¯ããããäºã€ã®ã¹ã±ãžã¥ãŒã©ããã£ãŠäžã€ã¯93%çšåºŠãããäžã€ã¯1%以äžãã䜿ã£ãŠããŸããã ãã ãhtopãå©çšãããšåã³ã¢ã®å©çšçã¯ä»¥äžã®ããã«èŠããŸãã
1 [||||||||||||||||||||||||| 70.4%]
2 [||||||| 20.6%]
3 [|||||||||||||||||||||||||||||100.0%]
4 [|||||||||||||||| 40.2%]
ãã®çµæã¯Erlangãæ¯èŒçæãªãšãã«ãšã£ãçµæã§ãããOSããã¿ããšå¿ããèŠããŸãã ä»ã«ãé¢çœãæ¯ãèããã¿ããŠããŠ1ç¹ç®ã®ãã€ã³ãã§ã¯OSãå ±åããŠããå 容ãã Erlangãå ±åããå 容ã®ã»ããé«ããªã£ãŠããŸããOSãªãœãŒã¹ãåŸ ã£ãŠããã¹ã±ãžã¥ãŒã©ãã¡ã¯ 圌ãããã以äžä»äºãã§ããªããã®ã ãšå€æããŠããŸããããOSãCPUãå©çšããªãã¿ã¹ã¯ãããŠããå Žå Erlangã¹ã±ãžã¥ãŒã©ã¯ä»äºãã§ããªããã®ã ãšå€æããŠé«ãå©çšçã衚瀺ãããŸãã ãããã®ææ¡ã¯å®¹éèšç»æã«ã¯éèŠã§CPUãæã瀺ããã®ããErlangã®ãã®ãä¿¡çšããæ¹ãããã§ãããã
å šäœã§ã¿ããšVMã®äžã§ã©ã®çšåºŠã¿ã¹ã¯ãããªããŠãããã¿ãããšãã§ããŸããäžè¬çã«Erlangã§ãããšããããŠããã®ã¯ æ¬åœã«åæã«åããŠããããã»ã¹ã䜿ãããšã§ããäŸãã°WebãµãŒãã§ãããš1ãªã¯ãšã¹ããããã¯1æ¥ç¶ã§1ããã»ã¹äœ¿ããŸãã ã¹ããŒããã«ã®å Žå1ãŠãŒã¶ããã1ããã»ã¹è¿œå ãããããšã«ãªãã§ãããããããŠããŒãäžã§äœæ¬ã®ããã»ã¹ã 䜿ã£ãŠããã®ãçµ±èšãååŸããããšãã§ããŸããã»ãšãã©ã®ããŒã«ã¯5.1ã§ã話ããŸãããããã¥ã¢ã«ã§å©çšãããšã㯠以äžã®ããã«ååŸã§ããŸãã
1> length(processes()).
56535
ãã®å€ãååŸããããšã§ããã»ã¹ãªãŒã¯çã®æ å ±ã«åœ¹ç«ãŠãããšãã§ããŸãã
ããŒããããã»ã¹ãšåæ§ã«èæ ®ãã¹ãã§ãã ããŒãã¯å€ã®äžçãšæ¥ç¶ããããã®ããŒã¿ã¿ã€ãã§ãTCPãœã±ãããUDPãœã±ãããSCTPãœã±ããã ãã¡ã€ã«èšè¿°åãªã©ããããããŸããããã»ã¹åæ§ããŒããã«ãŠã³ãããã¡ãœããããããŸããïŒlength(erlang:ports())ïŒ ããããã®ã¡ãœããã§ã¯å šãŠã®ã¿ã€ãã®ããŒããããŒãžããŠããŸãã®ã§ããã reconãå©çšããŠãããããœãŒãããŠã¿ããããšãå¯èœã§ãã
1> recon:port_types().
[{"tcp_inet",21480},
{"efile",2},
{"udp_inet",2},
{"0/1",1},
{"2/2",1},
{"inet_gethost 4 ",1}]
ãã®ãªã¹ãã¯åããŒãã«ã€ããŠã«ãŠã³ããããŠãããããŒã¿ã¿ã€ããæã£ãŠããŸãã ã¿ã€ãã®ååã¯Erlang VMãæã£ãŠãããã®èªèº«ãæååã«ãããã®ã§ãã "_inet"ãã€ããã®ã¯äžè¬çã«TCP,UDP,SCTPãšãã£ããããã³ã«ã瀺ããŸãã "etype"ãã¡ã€ã«ã¯äžè¬çã«ãã¡ã€ã«ã瀺ããã®ã§ã"0/1"ãš"2/2"ã¯æšæºIOãšæšæºãšã©ãŒIOã衚çŸããŠããŸãã ã»ãšãã©ã®ä»ã®ã¿ã€ãã¯port programãport driverãªã©ããã°ã©ã å ã§å©çšããããã©ã€ãåã瀺ããŸãã ãããã远跡ããããšã§ã·ã¹ãã ã®è² è·ç¶æ³ãã·ã¹ãã è©äŸ¡æŒãçã確èªããããšãã§ããŸãã
ããªããåé¡ãæã£ãŠå€§ããªãã°çãèŠããšãã¯ãã€ã§ãããŸãã¯ç®çã«ãã£ãŠãã®åšèŸºããèå³ãæã¡å§ããã§ãããã å¥åŠãªç¶æ ã®ããã»ã¹ããããŸããïŒã ãšãããããã¯è¿œè·¡ãå¿ èŠã«ãªããŸãïŒ è¿œè·¡ããããšã¯å ¥åºåã®ç¢ºèªçã§å€§å€äŸ¿å©ã§ããããã«ããã€ãåã«ããã£ãšæãäžããããšãå¿ èŠã§ãã ã¡ã¢ãªãªãŒã¯ä»¥å€ïŒã¡ã¢ãªãªãŒã¯èªäœã¯å°ãç¹å¥ãªæè¡ãå¿ èŠã§ããã¯7ç« ã§èª¬æããŸãïŒã¯ã»ãšãã©ã ããã»ã¹ãšããŒãïŒãã¡ã€ã«ãšãœã±ããïŒã«é¢é£ããŸãã
Erlangã·ã¹ãã ã«ãããŠããã»ã¹ã¯éåžžã«éèŠã§ãããªããªãããã»ã¹ã¯äžå¿ã«ããŠããããå§ãŸãã ããããå§ãŸãããšã®å€ããç¥ã£ãŠããŸãã幞éã«ãVMã¯å€ãã®æ å ±ãå©çšå¯èœã§ãããã€ãã¯å®å šã«äœ¿ãããšãã§ããŸããã ããã€ãã¯æ¬çªç°å¢ã§å©çšããã®ã«ããããããªããã®ããããŸãã ïŒãªããªããããã¯å€§éã®ããŒã¿ãã³ããŒããŠã¡ã¢ãªãŒãæ¶è²»ããããã衚瀺ããããšãããšããŒãããããããŠããŸããããããŸããïŒ
å šãŠã®å€ã¯process_info(Pid, key) ããã㯠process_info(Pid, [keys])ãåŒã¶ããšã§ååŸã§ããŸãã 以äžã«ããã€ãã®å ±éã§å©çšããããŒã瀺ããŸãã
Meta:
dictionary: ããã»ã¹èŸæžã«ããå
šãŠãè¿ããŸããäžè¬çã«ã®ã¬ãã€ãã¬ãã«ã®ããŒã¿ãå
¥ããã¹ãã§ã¯ãªãã®ã§å®å
šã§ãã
group_leader: IOãèµ°ã£ãŠããããã»ã¹ã®èŠªããã»ã¹(format/1-3ã®åºå)
registered_name: ããããã»ã¹ãååãæã£ãŠããããããè¿ããŸã
status: ã¹ã±ãžã¥ãŒã©ããèŠãããã»ã¹ã®ç¶æ
ãæ¬¡ã®å€ãæã£ãŠããŸãã
exiting: ããã»ã¹ã¯å®äºããŠãããã¯ãªã¢ãããŠããªãç¶æ
waiting: receive ... end ã§åŸ
ã£ãŠããç¶æ
running: å®è¡äž
runnable: å§ããããç¶æ
ã ãã¹ã±ãžã¥ãŒã«ãä»ã®ããã»ã¹ãå®è¡ããŠããç¶æ
garbage_collecting: GC
suspended: BIFãããã¯ããŒããããã¡ãäžæ¯ã«ãªã£ãŠããããšã«ãã£ãŠäžæãããŠããç¶æ
ã
ãã®ããã»ã¹ã¯ããŒããå¿ããç¶æ
ãããªããªã£ããšãã«åå®è¡ãããŸãã
Signals:
links: å
šãŠã®ãªã³ã¯ããŠããããã»ã¹ãšãœã±ããããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ã®äžèЧãè¿ããŸãã
åºæ¬çã«ã¯å®å
šã§ããæ°åã®æ
å ±ããã£ã倧ããªã¹ãŒããŒãã€ã¶ã«ã¯æ³šæãå¿
èŠã§ãã
monitored_by: çŸåšã®ããã»ã¹ãç£èŠããŠããããã»ã¹äžèЧãè¿ããŸã(erlang:monitor/2ãšåã)
monitors: monitored_byã®å察ã®çš®é¡ã§ããããããã»ã¹ã«ç£èŠãããŠããããã»ã¹äžäžžãè¿ããŸãã
trap_exit: ããããã»ã¹ããã©ããããŠããå Žåã¯trueããã以å€ã¯falseãè¿ããŸã
Location:
current_function: å®è¡äžã®é¢æ°æ
å ±ãã¿ãã«ã§è¡šçŸããŸãã{Mod, Fun, Arity}
current_location: ã¢ãžã¥ãŒã«å
ã®ã©ãã«ãããã¿ãã«ã§è¡šçŸããŸãã {Mod, Fun, Arity, [{File, Filename}, {line, Num]}
current_stacktrace: çŸåšã®ã¹ã¿ãã¯ãšã¬ãŒã¹ãè¿ããŸã
initial_call: ããã»ã¹ãspawnããããšãã®é¢æ°æ
å ±ã{Mod, Fun, Arity}ã§è¿ããŸããã©ã®ããã»ã¹ã«spawnããããèå¥ããéã«äŸ¿å©ã§ãã
Memory used:
binary: ãã€ããªãžã®åç
§ãšãã®ããŒã¿ãµã€ãºãè¿ããŸããããããã»ã¹ã倧éã«ããããè§£æŸããå Žåå®å
šã«å©çšã§ããªããããããŸããã
garbage collection: ããã»ã¹å
ã®GCãããæ
å ±ãè¿ããŸããå
容ã¯"subject to change"ãšããŠææžåãããŸãããã«sweep GCãªã©ã®ãªãã·ã§ã³ãéããŠäœåGCãããã®ããšããŒããµã€ãºã«ã€ããŠè¿ããŸãã
heap_size: Erlangããã»ã¹ã«ã¯oldãšnewããŒãããããŸãããããã¯GCã«ãã£ãŠæ¯ãåããããŸããããã¯äžçªæ°ããäžä»£ã®ããŒããã¹ã¿ãã¯ãµã€ãºå«ããŠè¿åŽãããŸããå€ã¯wordsã®äžã«å
¥ã£ãŠããŸãã
memory: ããã»ã¹ã§å©çšããŠããã¡ã¢ãªïŒã³ãŒã«ã¹ã¿ãã¯ãããŒããVMã§å©çšãããŠããã¡ã¢ãªïŒããã€ãã¬ãã«ã§è¿åŽããŸã
message_queue_len: ããã»ã¹ã®ã¡ãŒã«ããã¯ã¹ã®äžã«ããã¡ãã»ãŒãžæ°ãè¿ããŸã
message: ããã»ã¹ã®äžã«ããã¡ãã»ãŒãžå
šãŠãè¿ããŸããããã¯ãŸãã«ã¡ãŒã«ããã¯ã¹å
ãããã¯ããŠããŸãã®ã§æ¬çªç°å¢ã§å©çšããã®ã¯ããããã§ããªããšãããããŸããåžžã«ãŸãã¯message_queue_lenã§ãµã€ãºã確èªããtãã ããã
total_heap_size: heap_sizeãšäŒŒãŠããŸããããã«ã¯oldé åãå«ãŸããŠããŸãã
Work:
reductions: Erlang VMã¯ã¹ã±ãžã¥ãŒãªã³ã°ã®å®è£
ãããŒã¿ãã«ã«ããããšã§ä»»æã®ã¿ã¹ã¯åäœã§ã¹ã±ãžã¥ãŒãªã³ã°ã§ããããã«ããŠããŸããïŒæéããŒã¹ã«ãããšããããã®OSã§Erlang VMã¯å¹æçã«åããŸããïŒé«ãreductionsã§ããã°ããã»ã¹ãããããä»äºãããŠããããšã«ãªããŸãã
幞éã«ããããã¯å®å šã«å©çšå¯èœã§recon:info/1ãå©çšããããšã§ãã«ããæŽ»çšã§ããŸãã
1> recon:info("<0.12.0>").
[{meta,[{registered_name,rex},
{dictionary,[{â$ancestorsâ,[kernel_sup,<0.10.0>]},
{â$initial_callâ,{rpc,init,1}}]},
{group_leader,<0.9.0>},
{status,waiting}]},
{signals,[{links,[<0.11.0>]},
{monitors,[]},
{monitored_by,[]},
{trap_exit,true}]},
{location,[{initial_call,{proc_lib,init_p,5}},
{current_stacktrace,[{gen_server,loop,6,
[{file,"gen_server.erl"},{line,358}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,239}]}]}]},
{memory_used,[{memory,2808},
{message_queue_len,0},
{heap_size,233},
{total_heap_size,233},
{garbage_collection,[{min_bin_vheap_size,46422},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,0}]}]},
{work,[{reductions,35}]}]
recon:info/1ã¯ãããæ ç¹ã«ããŠåããããã«æåã®åŒæ°ã«pidã®ãããªãã®ãæå®ããŠãããæ±ããŸãã ããã¯pidã«é¢ããæåå("<0,12,0>")ãååãatomã§æå®({global, Atom})ããããã¯ãµãŒãããŒãã£ã®æå®æ¹åŒ(gproc: {via, gproc, Name})ã ã¿ãã«ã§ã®æå®({0, 12, 0})ãå¯èœã§ããããã»ã¹ã¯ãããã¯ãããããŒãã®ããŒã«ã«ã§ããããšãå¿ èŠã§ãã ããããªããã«ããŽãªæ å ±ã ãã»ããã®ã§ããã°çŽæ¥ä»¥äžã®ããã«åç §ã§ããŸãã
2> recon:info(self(), work).
{work,[{reductions,11035}]}
ãããã¯åãçããåºãã®ã«process_info/2ãå©çšå¯èœã§ãã
3> recon:info(self(), [memory, status]).
[{memory,10600},{status,running}]
åŸè ã®å Žåã¯äžç¢ºå®ãªæ å ±ãååŸããŠããããšã«ãªããŸãã å šãŠã®ããŒã¿ãå©çšããŠç§ãã¡ã¯ã·ã¹ãã ããããã¯ããããšãã§ããŸããçè§£ããããšããã«ã¯ æžãããã»ã¹ã®ããŒã¿ã察象ã®ããã»ã¹ã®ããŒã¿ãèŠãããšã«ãªãã§ãããã
é«ãã¡ã¢ãªå©çšçãèŠãå ŽåãäŸãšããŠããã»ã¹äžèЧãšé«ãã¡ã¢ãªå©çšçNåãã¿ãããšããŸãã ãã®ãšãã¯recon:proc_count(Attribute, N)ãå©çšãããšä»¥äžã®çµæãåŸãããšãã§ããŸãã
4> recon:proc_count(memory, 3).
[{<0.26.0>,831448,
[{current_function,{group,server_loop,3}},
{initial_call,{group,server,3}}]},
{<0.25.0>,372440,
[user,
{current_function,{group,server_loop,3}},
{initial_call,{group,server,3}}]},
{<0.20.0>,372312,
[code_server,
{current_function,{code_server,loop,1}},
{initial_call,{erlang,apply,2}}]}]
ããã€ãã®å±æ§ã衚瀺ãããŸãããé·ãæéåäœããŠããããã»ã¹ãææ¡ã§ããããããšãŠã䟿å©ã§ãã ããããªããåé¡ããã£ãŠã»ãšãã©ã®ããã»ã¹ãçåœã®å Žåãç¶æ³ã確èªããã®ã«ååãªæéããããŸããã ïŒäŸãã°ãã£ãä»å¿ããç¶æ ã«ããŠããã³ãŒããããã»ã¹ãææ¡ããããšããªã©ïŒ
ãããã£ãã±ãŒã¹ã®ããã«ãReconã¯recon:proc_window(Attribute, Num, Milliseconds)ãçšæããŠããŸãã ããã¯windowã®ã¹ãããã·ã§ãããèŠãã®ã«äŸ¿å©ã§ããäŸãã°ä»¥äžã®ãããªã¿ã€ã ã©ã€ã³ããã£ããšããŸãã
--w---- [Sample1] ---x-------------y----- [Sample2] ---z--->
ãã®é¢æ°ã¯äºã€ã®ãµã³ãã«ãããªã»ã³ã³ãç§ã§å®çŸ©ãããã®ãšããŸãã ãããã®ãµã³ãã«ã¯wãšx, yãšz, xãšyã®éã®ã©ããã§çåããã§ãããããããäžå®å šã®ãããããŸã圹ã«ã¯ãã¡ãŸããã ããããªãã®ããã»ã¹ãxããyã®éã«å®è¡ããããšãããšãããªãã¯ããããå°ãªãæéã«ãµã³ããªã³ã°ããããšã 確信ã§ããã®ã§wããzã®éãè©äŸ¡ããã°ããããšã«ãªããŸãããããããªãã§çµæãèŠããšã ããŒã¿ãèç©ããã®ã«10åæéããããé·æéããã»ã¹ãäžã€ã§ã¯ãªãã£ããšããããã¯å·šå€§ãªæ¶è²»è ã«ãªã£ãŠããŸããŸãã ãã®é¢æ°ã¯ä»¥äžã®ãããªçµæãåŸãããšãã§ããŸãã
5> recon:proc_window(reductions, 3, 500).
[{<0.46.0>,51728,
[{current_function,{queue,in,2}},
{initial_call,{erlang,apply,2}}]},
{<0.49.0>,5728,
[{current_function,{dict,new,0}},
{initial_call,{erlang,apply,2}}]},
{<0.43.0>,650,
[{current_function,{timer,sleep,1}},
{initial_call,{erlang,apply,2}}]}]
ãããäºã€ã®é¢æ°ã¯åé¡ã®ããããã»ã¹ã®ç¹åŸŽãèŠã€ããããšãã§ããŸãã
ããããã»ã¹ã«é¢ãã質åãOTPããã»ã¹ã®å ŽåïŒæ¬çªç°å¢ã«ããããã»ã¹ã¯å€§äœOTPã ãšãããïŒãããã ç£èŠããããŒã«ãããã«ãããŸããäžè¬çã«ã¯sysã¢ãžã¥ãŒã«ãå©çšããŠäžèº«ãèŠãããšã«ãªããŸãã ããã¥ã¡ã³ããèªãã°ãªã䟿å©ãããããŸããããã¯OTPã«å¯ŸããŠä»¥äžã®ãããªç¹åŸŽãæã£ãŠããŸãã
ããã»ã¹å®è¡ã®äžæãŸãã¯åéããæ©èœãæäŸããŸãã ãããã®è©³çްãŸã§ã¯ç«ã¡å ¥ããŸãããããããããããšã¯èŠããŠããã¹ãã§ãã