Phusionã«ã¯ ãRubyã«ã·ã³ãã«ãªãã«ãã¹ã¬ããHTTPãããã·ããããŸãïŒDEBããã³RPMããã±ãŒãžãé
åžããŸãïŒã ç§ã¯ããã§1.3 GBã®ã¡ã¢ãªæ¶è²»ãèŠãŸããã ããããããã¯ã¹ããŒãã¬ã¹ãªããã»ã¹ã«ã¯å€¢äžã§ã...
質åïŒããã¯äœã§ããïŒ åçïŒRubyã¯æéã®çµéãšãšãã«ã¡ã¢ãªã䜿çšããŸãïŒãã®åé¡ã¯ç§ã ãã§ã¯ãããŸããã Rubyã¢ããªã±ãŒã·ã§ã³ã¯å€ãã®ã¡ã¢ãªã䜿çšã§ããŸãã ãããããªãã§ããïŒ
Herokuãš
Nate Burkopekã«ãããšã
è¥å€§åã¯äž»ã«ã¡ã¢ãªã®æçåãšéå°ãª
ããŒãåæ£ã«ãããã®ã§ãã
Berkopekã¯ã2ã€ã®è§£æ±ºçããããšçµè«ä»ããŸããã
- glibcãšã¯ãŸã£ããç°ãªãã¡ã¢ãªã¢ãã±ãŒã¿ãŒïŒéåžžã¯jemalloc ïŒã䜿çšãããã次ã®ãããããå®è¡ããŸãã
- ããžãã¯ç°å¢å€æ°
MALLOC_ARENA_MAX=2
èšå®ããŸãã
åé¡ã®èª¬æãšææ¡ããã解決çãå¿é
ã§ãã ããã§äœããééã£ãŠããŸã...åé¡ãå®å
šã«æ£ããèšè¿°ãããŠãããããŸãã¯ããããå©çšå¯èœãªå¯äžã®ãœãªã¥ãŒã·ã§ã³ã§ãããã©ããã¯ããããŸããã ãŸããå€ãã®äººãjemallocãéæ³ã®éã®ããŒã«ãšåŒãã§ããããšãæ©ãŸããŠããŸãã
éæ³ã¯ç§ãã¡ããŸã ç解ããŠããªãç§åŠã§ã ã ããã§ãç§ã¯ãã¹ãŠã®çå®ãèŠã€ããããã«èª¿æ»æ
è¡ã«è¡ããŸããã ãã®èšäºã§ã¯ã次ã®ãããã¯ã«ã€ããŠèª¬æããŸãã
- ã¡ã¢ãªå²ãåœãŠã®ä»çµã¿ã
- 誰ãã話ããŠãããã®ã¡ã¢ãªã®ãæçåããšãéå°ãªåæ£ããšã¯äœã§ããïŒ
- 倧ããªã¡ã¢ãªæ¶è²»ã®åå ã¯äœã§ããïŒ ç¶æ³ã¯äººã
ãèšã£ââãŠããããšãšäžèŽããŠããŸããããããšãäœãä»ã®ãã®ããããŸããïŒ ïŒãã¿ãã¬ïŒã¯ããä»ã«ããããŸãïŒã
- 代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒ ïŒãã¿ãã¬ïŒèŠã€ããïŒã
泚ïŒãã®èšäºã¯Linuxã«ã®ã¿é¢é£ãããã«ãã¹ã¬ããRubyã¢ããªã±ãŒã·ã§ã³ã«ã®ã¿é¢é£ããŸããå
容
Rubyã®ã¡ã¢ãªå²ãåœãŠïŒã¯ããã«
Rubyã¯ãäžããäžã®3ã€ã®ã¬ãã«ã§ã¡ã¢ãªãå²ãåœãŠãŸãã
- Rubyãªããžã§ã¯ãã管çããRubyã€ã³ã¿ãŒããªã¿ãŒã
- ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã¡ã¢ãªã¢ãã±ãŒã¿ã©ã€ãã©ãªã
- ã³ã¢ã
åã¬ãã«ãèŠãŠãããŸãããã
ã«ããŒ
äžæ¹ãRubyã¯ã
RubyããŒãããŒãžãšåŒã°ããã¡ã¢ãªé åã«ãªããžã§ã¯ããæŽçããŸãã ãã®ãããªããŒãããŒãžã¯åããµã€ãºã®ã¹ãããã«åå²ããã1ã€ã®ãªããžã§ã¯ãã1ã€ã®ã¹ããããå æããŸãã æååãããã·ã¥ããŒãã«ãé
åãã¯ã©ã¹ããŸãã¯ä»ã®äœãã§ãããã©ãããããã¯1ã€ã®ã¹ããããå æããŸãã
ããŒãããŒãžã®ã¹ãããã¯ããžãŒãŸãã¯ç©ºãã§ãã Rubyãæ°ãããªããžã§ã¯ããéžæãããšãããã«ç©ºãã¹ããããå æããããšããŸãã 空ãã¹ãããããªãå Žåãæ°ããããŒãããŒãžã匷調衚瀺ãããŸãã
ã¹ãããã¯å°ãããçŽ40ãã€ãã§ãã æããã«ãããšãã°1 MBè¡ãªã©ãäžéšã®ãªããžã§ã¯ãã¯ããã«é©åããŸããã 次ã«ãRubyã¯æ
å ±ãããŒãããŒãžä»¥å€ã®å Žæã«ä¿åãããã®å€éšã¡ã¢ãªé åãžã®ãã€ã³ã¿ãŒãã¹ãããã«é
眮ããŸãã
ã¹ãããã«åãŸããªãããŒã¿ã¯ãããŒãããŒãžã®å€éšã«æ ŒçŽãããŸãã Rubyã¯ããã®å€éšããŒã¿ãžã®ãã€ã³ã¿ãŒãã¹ãããã«é
眮ããŸãRubyããŒãããŒãžãšå€éšã¡ã¢ãªé åã®äž¡æ¹ããã·ã¹ãã ã¡ã¢ãªã¢ãã±ãŒã¿ã䜿çšããŠå²ãåœãŠãããŸãã
ã·ã¹ãã ã¡ã¢ãªã¢ãã±ãŒã¿ãŒ
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã¡ã¢ãªã¢ãã±ãŒã¿ã¯ãglibcïŒCã©ã³ã¿ã€ã ïŒã®äžéšã§ãã Rubyã ãã§ãªããã»ãŒãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŸãã ã·ã³ãã«ãªAPIããããŸãã
- ã¡ã¢ãªã¯
malloc(size)
åŒã³åºãããšã«ããå²ãåœãŠãããŸãã å²ãåœãŠããã€ãæ°ãæå®ãããšãå²ãåœãŠã¢ãã¬ã¹ãŸãã¯ãšã©ãŒãè¿ãããŸãã - å²ãåœãŠãããã¡ã¢ãªã¯ã
free(address)
åŒã³åºãããšã«ãã£ãŠè§£æŸããfree(address)
ã
åããµã€ãºã®ã¹ããããå²ãåœãŠãããRubyãšã¯ç°ãªããã¡ã¢ãªã¢ãã±ãŒã¿ãŒã¯ãä»»æã®ãµã€ãºã®ã¡ã¢ãªãå²ãåœãŠãèŠæ±ãåŠçããŸãã åŸã§åŠã¶ããã«ããã®äºå®ã¯ããã€ãã®å䜵çã«ã€ãªãããŸãã
次ã«ãã¡ã¢ãªã¢ãã±ãŒã¿ã¯ã«ãŒãã«APIã«ã¢ã¯ã»ã¹ããŸãã ã«ãŒãã«ã³ãŒã«ã¯é«äŸ¡ã§ãããã«ãŒãã«APIã«ã¯4 KBã®åæ°ã§ããã¡ã¢ãªãå²ãåœãŠãããšãã§ããªããããã«ãŒãã«ããã®ã¡ã¢ãªãã£ã³ã¯ãããèªäœã®ãµãã¹ã¯ã©ã€ãèŠæ±ãããã¯ããã«å€§ãããªããŸãã
ã¡ã¢ãªã¢ãã±ãŒã¿ã¯ãã·ã¹ãã ããŒããšåŒã°ãã倧ããªãã£ã³ã¯ãå²ãåœãŠããã®å
容ãå
±æããŠã¢ããªã±ãŒã·ã§ã³ããã®èŠæ±ãæºãããŸãã¡ã¢ãªã¢ãã±ãŒã¿ãã«ãŒãã«ããå²ãåœãŠãã¡ã¢ãªé åã¯ãããŒããšåŒã°ããŸãã RubyããŒãã®ããŒãžãšã¯é¢ä¿ããªããããæ確ã«ããããã«
ã·ã¹ãã ããŒããšããçšèªã䜿çšã
ãŸã ã
ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã¯ã空ãé åãã§ãããŸã§ãã·ã¹ãã ããŒãã®äžéšãåŒã³åºãå
ã«å²ãåœãŠãŸãã ãã®å Žåãã¡ã¢ãªã¢ãã±ãŒã¿ãŒã¯ã«ãŒãã«ããæ°ããã·ã¹ãã ããŒããå²ãåœãŠãŸãã ããã¯ãRubyãRubyããŒãã®ããŒãžãããªããžã§ã¯ããæœåºããæ¹æ³ã«äŒŒãŠããŸãã
Rubyã¯ã¡ã¢ãªã¢ãã±ãŒã¿ããã¡ã¢ãªãå²ãåœãŠãã¡ã¢ãªã¢ãã±ãŒã¿ã¯ã«ãŒãã«ããã¡ã¢ãªãå²ãåœãŠãŸãã³ã¢
ã«ãŒãã«ã¯4 KBåäœã§ã®ã¿ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãã ãã®ãããª4Kãããã¯ã®1ã€ã¯ããŒãžãšåŒã°ããŸãã RubyããŒãããŒãžãšã®æ··ä¹±ãé¿ããããã«ãæ確ã«ããããã«ã
ã·ã¹ãã ããŒãž ïŒOSããŒãžïŒãšããçšèªã䜿çšããŸãã
çç±ã説æããã®ã¯å°é£ã§ããããããææ°ã®ã«ãŒãã«ã®åäœæ¹æ³ã§ãã
ã«ãŒãã«ãä»ããã¡ã¢ãªã®å²ãåœãŠã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸãããã®ãããã¡ã¢ãªã¢ãã±ãŒã¿ã¯ã«ãŒãã«åŒã³åºãã®æ°ãæå°éã«ããããšããŸãã
ã¡ã¢ãªäœ¿çšéã®å®çŸ©
ãããã£ãŠãã¡ã¢ãªã¯è€æ°ã®ã¬ãã«ã§å²ãåœãŠãããåã¬ãã«ã¯å®éã«å¿
èŠãªéããå€ãã®ã¡ã¢ãªãå²ãåœãŠãŸãã RubyããŒãããŒãžã«ã¯ãã·ã¹ãã ããŒãã ãã§ãªãã空ãã¹ããããå«ããããšãã§ããŸãã ãããã£ãŠããã©ã®ãããã®ã¡ã¢ãªã䜿çšãããŠããŸããïŒããšãã質åã«å¯Ÿããçãã¯ãå°ããã¬ãã«ã«å®å
šã«äŸåããŸãïŒ
top
ã
ps
ãªã©ã®ããŒã«ã¯ã
ã«ãŒãã«ã®èŠ³ç¹ããã¡ã¢ãªäœ¿çšéã衚瀺ããŸãã ã€ãŸããã«ãŒãã«ã®èŠ³ç¹ããã¡ã¢ãªã解æŸããã«ã¯ãäžäœã¬ãã«ãå調ããŠåäœããå¿
èŠããããŸãã åŸã§åŠã¶ããã«ãããã¯æã£ãããé£ããã§ãã
ãã©ã°ã¡ã³ããŒã·ã§ã³ãšã¯äœã§ããïŒ
ã¡ã¢ãªã®æçåãšã¯ãã¡ã¢ãªã®å²ãåœãŠãã©ã³ãã ã«åæ£ãããããšãæå³ããŸãã ããã¯èå³æ·±ãåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
Rubyã¬ãã«ã®æçå
Rubyã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæ€èšããŠãã ããã ãªããžã§ã¯ãã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãRubyããŒãããŒãžã¹ãããã空ããšããŠããŒã¯ããåå©çšã§ããããã«ããããšãæå³ããŸãã RubyããŒãã®ããŒãžå
šäœã空ãã¹ãããã®ã¿ã§æ§æãããŠããå Žåããã®ããŒãžå
šäœã解æŸããŠã¡ã¢ãªã¢ãã±ãŒã¿ã«æ»ãããšãã§ããŸãïŒå Žåã«ãã£ãŠã¯ãã«ãŒãã«ã«æ»ãããšãã§ããŸãïŒã
ãããããã¹ãŠã®ã¹ãããã空ããŠããªãå Žåã¯ã©ããªããŸããïŒ RubyããŒãã®ããŒãžãå€ããã¬ããŒãžã³ã¬ã¯ã¿ãŒãç°ãªãå Žæã«ãããªããžã§ã¯ãã解æŸããæçµçã«ã¯ç°ãªãããŒãžã«å€ãã®ç©ºãã¹ããããããå Žåã¯ã©ãã§ããããã ãã®ç¶æ³ã§ã¯ãRubyã«ã¯ãªããžã§ã¯ããé
眮ããããã®ç©ºãã¹ãããããããŸãããã¡ã¢ãªã¢ãã±ãŒã¿ãŒãšã«ãŒãã«ã¯åŒãç¶ãã¡ã¢ãªãå²ãåœãŠãŸãïŒ
ã¡ã¢ãªå²ãåœãŠã®æçå
ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã«ãåæ§ã®åé¡ããããŸããããŸã£ããç°ãªãåé¡ããããŸãã ã·ã¹ãã ããŒãå
šäœãäžåºŠã«è§£æŸããå¿
èŠã¯ãããŸããã çè«çã«ã¯ãåäžã®ã·ã¹ãã ããŒãžã解æŸã§ããŸãã ãã ããã¡ã¢ãªã¢ãã±ãŒã¿ã¯ä»»æã®ãµã€ãºã®ã¡ã¢ãªå²ãåœãŠãåŠçãããããã·ã¹ãã ããŒãžã«ããã€ãã®å²ãåœãŠãååšããå ŽåããããŸãã ãã¹ãŠã®éžæã解æŸããããŸã§ãã·ã¹ãã ããŒãžã解æŸã§ããŸããã
3 KBã®å²ãåœãŠãš2 KBã®å²ãåœãŠã2ã€ã®ã·ã¹ãã ããŒãžã«åå²ãããŠããå Žåã¯ã©ããªãããèããŠãã ããã æåã®3 KBã解æŸãããšãäž¡æ¹ã®ã·ã¹ãã ããŒãžãéšåçã«å æããããŸãŸã«ãªãã解æŸã§ããªããªããŸãã
ãããã£ãŠãç¶æ³ã倱æããå Žåãã·ã¹ãã ããŒãžã«ã¯å€ãã®ç©ºãé åããããŸããããããã¯å®å
šã«ã¯è§£æŸãããŸããã
ããã«æªãããšã¯ã空ãå Žæãããããããããæ°ããå²ãåœãŠèŠæ±ãæºããã®ã«ååãªå Žæããªãå Žåã¯ã©ãã§ããããïŒ ã¡ã¢ãªã¢ãã±ãŒã¿ã¯ããŸã£ããæ°ããã·ã¹ãã ããŒããå²ãåœãŠãå¿
èŠããããŸãã
RubyããŒãããŒãžã®æçåãã¡ã¢ãªã®èšåŒµãåŒãèµ·ãããŠããŸããïŒ
æçåãRubyã§ã®éå°ãªã¡ã¢ãªäœ¿çšãåŒãèµ·ãããŠããå¯èœæ§ããããŸãã ãããããªãã2ã€ã®æçåã®ã©ã¡ããããæ害ã§ããïŒ ããã¯...
- RubyããŒãããŒãžã®æçåïŒ ãŸãã¯
- ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã®æçåïŒ
æåã®ãªãã·ã§ã³ã¯ããã§ãã¯ããã®ã«ååç°¡åã§ãã Rubyã¯ã
ObjectSpace.memsize_of_all
ãš
GC.stat
2ã€ã®APIãæäŸããŸãã ãã®æ
å ±ã®ãããã§ãRubyãã¢ãã±ãŒã¿ãŒããåãåã£ããã¹ãŠã®ã¡ã¢ãªãŒãèšç®ã§ããŸãã
ObjectSpace.memsize_of_all
ã¯ããã¹ãŠã®ã¢ã¯ãã£ããªRubyãªããžã§ã¯ããå æããŠããã¡ã¢ãªãè¿ããŸãã ã€ãŸããã¹ãããå
ã®ãã¹ãŠã®ã¹ããŒã¹ãšå€éšããŒã¿ã äžã®å³ã§ã¯ãããã¯ãã¹ãŠã®éãšãªã¬ã³ãžã®ãªããžã§ã¯ãã®ãµã€ãºã§ãã
GC.stat
䜿çš
GC.stat
ãšããã¹ãŠã®ç©ºãã¹ãããã®ãµã€ãºãã€ãŸãäžã®å³ã®ç°è²ã®é åå
šäœã確èªã§ã
GC.stat
ã ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
GC.stat[:heap_free_slots] * GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]
ããããèŠçŽãããšãããã¯Rubyãç¥ã£ãŠãããã¹ãŠã®ã¡ã¢ãªã§ãããRubyããŒãã®ããŒãžã®æçåã䌎ããŸãã ã«ãŒãã«ã®èŠ³ç¹ãããã¡ã¢ãªäœ¿çšéãå€ãå Žåãæ®ãã®ã¡ã¢ãªã¯Rubyã®å¶åŸ¡å€ã®ã©ãããäŸãã°ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãæçåã«è¡ããŸãã
ç§ã¯ããããããã«ãŒãå
ã®è¡ãéžæããå€æ°ã®ã¹ã¬ãããäœæããç°¡åãªãã¹ãããã°ã©ã ãäœæããŸããã ãã°ããããŠããã®çµæã¯æ¬¡ã®ãšããã§ãã
ããã¯...ãã ...ã¯ã¬ã€ãžãŒã§ãïŒ
çµæã¯ãRubyã䜿çšãããã¡ã¢ãªã®ç·éã«éåžžã«åŒ±ã圱é¿ãäžããããšã瀺ããŠãããRubyããŒãã®ããŒãžãæçåãããŠãããã©ããã¯é¢ä¿ãããŸããã
ä»ã®å Žæã§ç¯äººãæ¢ãå¿
èŠããããŸãã å°ãªããšãä»ã§ã¯ãRubyã®ããã§ã¯ãªãããšãããã£ãŠããŸãã
ã¡ã¢ãªå²ãåœãŠãã©ã°ã¡ã³ããŒã·ã§ã³ã®ç 究
å¥ã®å®¹çè
ã¯ã¡ã¢ãªã¢ãã±ãŒã¿ã§ãã æçµçã«ãNate BerkopekãšHerokuã¯ãã¡ã¢ãªã¢ãã±ãŒã¿ãŒïŒjemallocã®å®å
šãªçœ®ãæããŸãã¯éæ³ã®ç°å¢å€æ°
MALLOC_ARENA_MAX=2
ïŒã
MALLOC_ARENA_MAX=2
ã«ãããã¡ã¢ãªäœ¿çšéã倧å¹
ã«åæžãããããšã«
MALLOC_ARENA_MAX=2
ã
æåã«
MALLOC_ARENA_MAX=2
ãäœãããã®ãããããŠãªãããã圹ç«ã€ã®ããèŠãŠã¿ãŸãããã 次ã«ããã£ã¹ããªãã¥ãŒã¿ãŒã¬ãã«ã§ãã©ã°ã¡ã³ããŒã·ã§ã³ã調ã¹ãŸãã
éå°ãªã¡ã¢ãªå²ãåœãŠãšglibc
MALLOC_ARENA_MAX=2
圹ç«ã€çç±ã¯ããã«ãã¹ã¬ããã«ãããã®ã§ãã è€æ°ã®ã¹ã¬ãããåãã·ã¹ãã ããŒãããåæã«ã¡ã¢ãªãå²ãåœãŠãããšãããšããããã®ã¹ã¬ããã¯ã¢ã¯ã»ã¹ã®ããã«æŠããŸãã äžåºŠã«1ã€ã®ã¹ã¬ããã®ã¿ãã¡ã¢ãªãåä¿¡ã§ããããããã«ãã¹ã¬ããã¡ã¢ãªå²ãåœãŠã®ããã©ãŒãã³ã¹ãäœäžããŸãã
ã·ã¹ãã ããŒãã§åäœã§ããã¹ã¬ããã¯äžåºŠã«1ã€ã ãã§ãã ãã«ãã¹ã¬ããã®ã¿ã¹ã¯ã§ã¯ã競åãçºçãããã®çµæãããã©ãŒãã³ã¹ãäœäžããŸããã®ãããªå Žåã®ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã«ã¯ãæé©åããããŸãã 圌ã¯ããã€ãã®ã·ã¹ãã ããŒããäœæããããããç°ãªãã¹ã¬ããã«å²ãåœãŠãããšããŸãã ã»ãšãã©ã®å Žåãã¹ã¬ããã¯ç¬èªã®ããŒãã§ã®ã¿åäœããä»ã®ã¹ã¬ãããšã®ç«¶åãåé¿ããŸãã
å®éããã®æ¹æ³ã§å²ãåœãŠãããã·ã¹ãã ããŒãã®æ倧æ°ã¯ãããã©ã«ãã§ä»®æ³ããã»ããµã®æ°ã«8ãæããå€ã«çãããªããŸããã€ãŸãã2ã€ã®ãã€ããŒã¹ã¬ãããæã€ãã¥ã¢ã«ã³ã¢ã·ã¹ãã ã§ã¯ããããã
2 * 2 * 8 = 32
ã·ã¹ãã ããŒããçæãããŸãïŒ ããã¯ç§ã
é床ã®åé
ãšåŒã¶ãã®ã§ãã
ããã©ã«ãã®ä¹æ°ããªããããªã«å€§ããã®ã§ããïŒ ã¡ã¢ãªã¢ãã±ãŒã¿ãŒã®äž»èŠãªéçºè
ã¯Red Hatã§ããããã§ãã 顧客ã¯ã匷åãªãµãŒããŒãšå€§éã®RAMãåãã倧äŒæ¥ã§ãã äžèšã®æé©åã«ãããã¡ã¢ãªäœ¿çšéã倧å¹
ã«å¢å ãããããå¹³åçãªãã«ãã¹ã¬ããããã©ãŒãã³ã¹ã10ïŒ
åäžããŸãã Red Hatã®ã客æ§ã«ãšã£ãŠãããã¯è¯ã劥åæ¡ã§ãã æ®ãã®ã»ãšãã©-ã»ãšãã©ã
圌女ã®ããã°ãšHerokuã®èšäºã§ãã€ãã¯ãã·ã¹ãã ããŒãã®æ°ãå¢ãããšæçåãå¢å ããå
¬åŒããã¥ã¡ã³ããåŒçšããŠãããšäž»åŒµããŠããŸãã
MALLOC_ARENA_MAX
å€æ°ã¯ããã«ãã¹ã¬ããã«å²ãåœãŠãããã·ã¹ãã ããŒãã®æ倧æ°ãæžãããŸãã ãã®ããžãã¯ã«ãããæçåãæžå°ããŸãã
ã·ã¹ãã ããŒãã®èŠèŠå
ã·ã¹ãã ããŒãã®æ°ãå¢ãããšæçåãå¢ãããšããNateãšHerokuã®å£°æã¯æ¬åœã§ããïŒ å®éãã¡ã¢ãªã¢ãã±ãŒã¿ãŒã¬ãã«ã§ã®æçåã«åé¡ã¯ãããŸããïŒ ç§ã¯ãããã®ä»®å®ã®ã©ããåœããåã®ãã®ã«ããããªãã£ãã®ã§ãç 究ãå§ããŸããã
æ®å¿µãªãããã·ã¹ãã ããŒããèŠèŠåããããŒã«ã¯ãªãããããã®
ãããªããžã¥ã¢ã©ã€ã¶ãèªåã§äœæããŸãã ã
ãŸããäœããã®æ¹æ³ã§ã·ã¹ãã ããŒãã®åæ£ã¹ããŒã ãä¿æããå¿
èŠããããŸãã ç§
ã¯ã¡ã¢ãªã¢ãã±ãŒã¿ã®ãœãŒã¹ãç 究ãããããå
éšçã«ã¡ã¢ãªãã©ã®ããã«è¡šçŸããŠããããèŠãŸããã 次ã«ããããã®ããŒã¿æ§é ãå埩åŠçããã¹ããŒãããã¡ã€ã«ã«æžã蟌ãã©ã€ãã©ãªãäœæããŸããã æåŸã«ã圌ã¯ãã®ãããªãã¡ã€ã«ãå
¥åãšããŠåãåããèŠèŠåãHTMLããã³PNGç»åïŒ
ãœãŒã¹ã³ãŒã ïŒãšããŠã³ã³ãã€ã«ããããŒã«ãäœæããŸããã
ç¹å®ã®ã·ã¹ãã ããŒããèŠèŠåããäŸã次ã«ç€ºããŸãïŒããã«å€ããããŸãïŒã ãã®èŠèŠåã®å°ããªãããã¯ã¯ãã·ã¹ãã ããŒãžãè¡šããŸãã
- èµ€è²ã®é åã¯äœ¿çšæžã¿ã¡ã¢ãªã»ã«ã§ãã
- ç°è²ã¯ãã³ã¢ã«è§£æŸãããªã空ãé åã§ãã
- æ žã®ããã«çœãé åã解æŸãããŸãã
èŠèŠåãã次ã®çµè«ãåŒãåºãããšãã§ããŸãã
- ããã€ãã®æçåããããŸãã èµ€ãæç¹ã¯ã¡ã¢ãªããæ£ãã°ã£ãŠãããäžéšã®ã·ã¹ãã ããŒãžã¯ååã ãèµ€ããªã£ãŠããŸãã
- é©ããããšã«ã ã»ãšãã©ã®ã·ã¹ãã ããŒãã«ã¯ãå®å
šã«ç¡æã®ã·ã¹ãã ããŒãžïŒã°ã¬ãŒïŒã倧éã«å«ãŸããŠããŸãã
ãããŠãããã¯ç§ã«å€æããåããŸããïŒ
ãã©ã°ã¡ã³ããŒã·ã§ã³ã¯åé¡ã®ãŸãŸã§ãããããã¯ãã€ã³ãã§ã¯ãããŸããïŒããããåé¡ã¯å€ãã®ç°è²ã§ãïŒãã®ã¡ã¢ãªã¢ãã±ãŒã¿ãŒ
ã¯ã¡ã¢ãªãã«ãŒãã«ã«éãè¿ããŸãã ïŒ
ã¡ã¢ãªã¢ãã±ãŒã¿ã®ãœãŒã¹ã³ãŒããåæ€èšããçµæãããã©ã«ãã§ã¯ã·ã¹ãã ããŒãã®æåŸã«ã·ã¹ãã ããŒãžã®ã¿ãã«ãŒãã«ã«éä¿¡ããã
ãã£ãã«éä¿¡ãããªãããšãå€æããŸã
ã ã ããããããã®ãããªã¢ã«ãŽãªãºã ã¯ããã©ãŒãã³ã¹äžã®çç±ã§å®è£
ãããŠããŸãã
ããžãã¯ããªãã¯ïŒå²ç€Œ
幞ããªããšã«ãç§ã¯1ã€ã®ããªãã¯ãèŠã€ããŸããã ã¡ã¢ãªã¢ãã±ãŒã¿ã«ãæåŸã®ã«ãŒãã«ããŒãžã ãã§ãªã
ãé¢é£ãã
ãã¹ãŠã®ã·ã¹ãã ããŒãžã®è§£æŸã匷å¶ããããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã1ã€ãããŸãã
malloc_trimãšåŒã°ã
ãŸã ã
ãã®æ©èœã«ã€ããŠã¯ç¥ã£ãŠããŸãããã圹ã«ç«ã€ãšã¯æããŸããã§ãããããã¥ã¢ã«ã«ã¯æ¬¡ã®ããã«æžãããŠããããã§ãã
malloc_trimïŒïŒé¢æ°ã¯ãããŒãã®äžéšã§ç©ºãã¡ã¢ãªã解æŸããããšããŸãã
ããã¥ã¢ã«ãééã£ãŠããŸãïŒ ãœãŒã¹ã³ãŒãã®åæã«ãããšãããã°ã©ã ã¯ãããã ãã§ãªããé¢é£ãããã¹ãŠã®ã·ã¹ãã ããŒãžã解æŸããŸãã
ãã®é¢æ°ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³äžã«åŒã³åºããããšã©ããªããŸããïŒ Ruby 2.6ã®ãœãŒã¹ã³ãŒããå€æŽããŠã
gc_start
é¢æ°ã§
malloc_trim()
ãåŒã³åºããŸãã
malloc_trim()
äŸã瀺ããŸãã
gc_prof_timer_start(objspace); { gc_marks(objspace, do_full_mark);
ãã¹ãçµæã¯æ¬¡ã®ãšããã§ãã
ãªããšãã倧ããªéãã§ãããïŒ ç°¡åãªãããã«ãããã¡ã¢ãªæ¶è²»ãã»ãŒ
MALLOC_ARENA_MAX=2
åæžãããŸããã
ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã§ã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãã
ã«ãŒãã«ã«è§£æŸãããã·ã¹ãã ããŒãžã«å¯Ÿå¿ããå€ãã®çœãé åã衚瀺ãããŸãã
ãããã«
åºæ¬çã«ãæçåã¯ãããšã¯ç¡é¢ä¿ã§ããããšãå€æããŸããã æé©åã¯äŸç¶ãšããŠæçšã§ãããäž»ãªåé¡ã¯ãã¡ã¢ãªã¢ãã±ãŒã¿ãã¡ã¢ãªãã«ãŒãã«ã«æ»ãããšã奜ãŸãªãããšã§ãã
幞ããªããšã«ããã®ãœãªã¥ãŒã·ã§ã³ã¯éåžžã«ã·ã³ãã«ã§ããã äž»ãªãã®ã¯æ ¹æ¬åå ãèŠã€ããããšã§ããã
ããžã¥ã¢ã©ã€ã¶ãŒã®ãœãŒã¹ã³ãŒã
ãœãŒã¹ã³ãŒãããã©ãŒãã³ã¹ã¯ã©ãã§ããïŒ
ããã©ãŒãã³ã¹ã¯åŒãç¶ãäž»èŠãªæžå¿µäºé
ã®1ã€ã§ãã
malloc_trim()
åŒã³åºãã¯ç¡æã§ã¯ã§ããŸããããã³ãŒãã«ãããšãã¢ã«ãŽãªãºã ã¯ç·åœ¢æéã§åäœããŸãã ããã§ãRails Ruby Benchãã³ãããŒã¯ãç«ã¡äžãã
Noah Gibbsã«é ŒããŸããã é©ããããšã«ããã®ãããã«ããããã©ãŒãã³ã¹ããããã«
åäžããŸããã
ããã¯ç§ã®å¿ãå¹ãé£ã°ããŸããã å¹æã¯ç解ã§ããªããããã¥ãŒã¹ã¯è¯ãã
ããã«ãã¹ããå¿
èŠ
ãã®ç 究ã®äžç°ãšããŠãéãããæ°ã®çäŸã®ã¿ãæ€èšŒãããŠããŸãã ä»ã®ã¯ãŒã¯ããŒããžã®åœ±é¿ãäœã§ãããã¯äžæã§ãã ãã¹ããæ¯æŽãããå Žåã¯ã
ç§ã«é£çµ¡ããŠãã ãã ã