Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in...

92
Memory management tuning in Ruby Koichi Sasada <[email protected]> Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada <[email protected]> 1

Transcript of Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in...

Page 1: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Memory management tuning in Ruby

Koichi Sasada<[email protected]>

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>1

Page 2: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Summary of this talk

• Introduction of new versions• Ruby 2.1 (2.1.1 was released)

• Ruby 2.2 (currently working on)

• Basic of Ruby’s memory management (GC)

• GC tuning parameters• “What” and “How” we can tune by GC parameters

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>2

Page 3: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Who am I ?

• Koichi Sasada a.k.a. ko1

• From Japan

•笹田 (family name)耕一 (given name) in Kanji character• “Ichi” (Kanji character “一”) means “1” or first

• This naming rule represents I’m the first son of my parents

• Ko”ichi” → ko1

3Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 4: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Who am I ?

•CRuby/MRI committer• Virtual machine (YARV) from Ruby 1.9

• YARV development since 2004/1/1

• Recently, improving GC performance

• Matz team at Heroku, Inc.• Full-time CRuby developer

• Working in Japan

• Director of Ruby Association

4Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 5: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

• Foundation to encourage Ruby developments and communities• Chairman is Matz• Located at Matsue-city, Shimane, Japan

• Activities• Maintenance of Ruby (Cruby) interpreter

• Now, it is for Ruby 1.9.3• Ruby 2.0.0 in the future?

• Events, especially RubyWorld Conference• Ruby Prize• Grant project. We have selected 3 proposals in 2013

• Win32Utils Support, Conductor, Smalruby - smalruby-editor• We will make this grant 2014!!

• Donation for Ruby developments and communities

Advertisement

5Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 6: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

• Heroku, Inc. http://www.heroku.com

You should know about Heroku!!

• Heroku supports Ruby development• Many talents for Ruby, and also other languages

• Heroku employs 3 Ruby interpreter core developers• Matz

• Nobu

• Ko1 (me)

• We name our group “Matz team”

Advertisement

6Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

This talk is also sponsored

by Heroku!

Page 7: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

“Matz team” in Heroku

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>7

Page 8: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Matz team in Herokuin Japan

8

Matz @ ShimaneTitle collector

Nobu @ TochigiPatch monster

ko1 @ TokyoEDD developer

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>

Page 9: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

9

ko1 @ TokyoEDD developer

Matz @ ShimaneTitle collector

Communicationwith Skype

Matz team at HerokuHierarchy

Nobu @ TochigiPatch monster

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>

[Not stupid boss]

Page 10: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

MatzTitle collector• He has so many (job) title

• Chairman - Ruby Association• Fellow - NaCl• Chief architect, Ruby - Heroku• Research institute fellow – Rakuten• Chairman – NPO mruby Forum• Senior researcher – Kadokawa Ascii Research Lab• Visiting professor – Shimane University• Honorable citizen (living) – Matsue city• Honorable member – Nihon Ruby no Kai• …

• This margin is too narrow to contain

10Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 11: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Message from Matz

“I am awfully sorry for not being here.

But I love you.

Maybe next time!”

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>11

Page 12: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

NobuPatch monster• Great patch creator

12Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 13: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

NobuPatch monster

13Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

nobu29%

akr12%

svn9%

naruse8%

usa4%

ko14%

drbrain3%

kosaki3%

kazu2%

zzak2%

tenderlove2%

matz2%

marcandre2%

mame2%

tadf2%

knu1%

shugo1%

nagachika1%

yugui1%

kou1%

mrkn1%

emboss1%

shyouhei1%

nari0%

glass0%

ktsj0%

nahi0%

ayumin0%

tarui0%

sorah0%

ryan0%

charliesome0%

shirosaki0%

xibbar0%

nagai0%

eregon0%

ngoto0%

wanabe0%azav0%

keiju0%suke0%

kouji0%

duerst0%

takano320%

luislavena0%jeg20%hsbt0%

arton0%seki0%

kanemoto0%

tmm10%

eban0%

muraken0%

headius0%

evan0%

a_matsuda0%

iwamatsu0%

technorama0%

davidflanagan0%

gotoken0%

okkez0%

COMMIT RATIO IN LAST 5 YEARS

Page 14: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

0

5

10

15

20

25

20

10

/11

/8

20

11

/1/8

20

11

/3/8

20

11

/5/8

20

11

/7/8

20

11

/9/8

20

11

/11

/8

20

12

/1/8

20

12

/3/8

20

12

/5/8

20

12

/7/8

20

12

/9/8

20

12

/11

/8

20

13

/1/8

20

13

/3/8

20

13

/5/8

20

13

/7/8

20

13

/9/8

20

13

/11

/8

Commit number of ko1 (last 3 years)

Ko1EDD developer

14

RubyConf2012

RubyKaigi2013

Ruby 2.0

Euruko2013

RubyConf2013

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>

EDD: Event Driven Development

Page 15: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Mission of Matz team

• Improve quality of next version of CRuby• Matz decides a spec finally

• Nobu fixed huge number of bugs

• Ko1 improves the performance

Current target is Ruby 2.2!!Now, Ruby 2.1 is old version for us.

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>15

Page 16: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1Current stable

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>16

http://www.flickr.com/photos/loginesta/5266114104

Page 17: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1

• Ruby 2.1.0 was released at 2013/12/25• New features

• Performance improvements

• Ruby 2.1.1 was released at 2014/02/24• Includes many bug fixes found after 2.1.0 release

• Introduce a new GC tuning parameter to change generational GC behavior (introduce it later)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>17

Page 18: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 the biggest change Version policy• Change the versioning policy

• Drop “patch level” in the version

• Teeny represents patch level• Release new teeny versions about every 3 month

• Teeny upgrades keep compatibility

• Minor upgrades can break backward compatibility• We make an effort to keep compatibility

(recently. Remember Ruby 1.9 )

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>18

Page 19: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 New syntax

•New syntaxes• Required keyword

parameter• Rational number literal• Complex number literal• `def’ returns symbol of

method name

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>19

http://www.flickr.com/photos/rooreynolds/4133549889

Page 20: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 SyntaxRequired keyword parameter• Keyword argument (from Ruby 2.0.0)

• def foo(a: 1, b: 2); end

• `a’ and `b’ are optional parameters

• OK: foo(); foo(a: 1); foo(a: 1, b: 2); foo(b: 2)

• Required keyword argument from 2.1• def foo(a: 1, b: )

• `a’ is optional, but `b’ is required parameter

• OK: foo(a: 1, b: 2); foo(b: 2)

• NG: foo(); foo(a: 1)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>20

Page 21: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 SyntaxRational number literals• To represent ½, in Ruby “Rational(1, 2)”

→ Too long!!

• Introduce “r” suffix

½ → 1/2r

• “[digits]r” represents “Rational([digits], 1)”

• ½ → 1/2r• 1/2r #=> 1/Rational(2, 1)

• 1/Rational(2, 1) #=> Rational(1/2)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>21

Page 22: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 SyntaxComplex number literals• We already have “Integer#i” method to make

imaginary number like “1+2.i”

• We already introduced “r” suffix for Rational

→ No reason to prohibit “i” suffix!!

• [digits]i represents “Complex(0, [digits])”

• 1+2i #=> 1+Complex(0, 2)

• 1+Complex(0, 2) #=> Complex(1, 2)

• You can mix “r” and “i” suffix

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>22

Page 23: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 SyntaxReturn value of `def’ syntax

• Return value of method definition• Method definition syntax returns symbol of

defined method name

• `def foo; …; end’ #=> :foo

• Method modifier methods• Example:

• private def foo; …; end

• public static void def main(args); …; end

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>23

Page 24: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 Runtime new features

• String#scrub

• Process.clock_gettime

• Binding#local_variable_get/set

• Bignum now uses GMP (if available)

• Extending ObjectSpace

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>24

Page 25: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.1 Runtime new featuresObject tracing• ObjectSpace. trace_object_allocations

• Trace object allocation and record allocation-site• Record filename, line number, creator method’s id and class

• Usage:ObjectSpace.trace_object_allocations{ # record only in the block

o = Object.new

file = ObjectSpace.allocation_sourcefile(o) #=> __FILE__

line = ObjectSpace.allocation_sourceline(o) #=> __LINE__ -2

}

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>25

Page 26: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Performance improvements

• Optimize “string literal”.freeze

• Sophisticated inline method cache

• Introducing Generational GC: RGenGC

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>26

Page 27: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RGenGC: Generational GC for Ruby• RGenGC: Restricted Generational GC

• Generational GC (minor/major GC uses M&S)• Dramatically speedup for GC-bottleneck applications• New generational GC algorithm allows mixing “Write-

barrier protected objects” and “WB unprotected objects”→ No (mostly) compatibility issue with C-exts

• Inserting WBs gradually• We can concentrate WB insertion efforts for major objects

and major methods• Now, most of objects (such as Array, Hash, String, etc.) are

WB protected• Array, Hash, Object, String objects are very popular in Ruby• Array objects using RARRAY_PTR() change to WB unprotected

objects (called as Shady objects), so existing codes still works.

27Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 28: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

0

2

4

6

8

10

12

14

Total mark time (ms) Total sweep time (sec)

Acc

um

ula

ted

exe

cuti

on

tim

e (

sec)

w/o RGenGC RGenGC

RGenGCPerformance evaluation (RDoc)

28

About x15 speedup!

* Disabled lazy sweep to measure correctly.Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 29: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RGenGCPerformance evaluation (RDoc)

29

* 12% improvements compare with w/ and w/o RGenGC* Disabled lazy sweep to measure correctly.

103.7627479 102.3799865

16.043938154.946003494

0

20

40

60

80

100

120

140

w/o RGenGC RGenGC

Tota

l exe

cuti

on

tim

e (s

ec)

other than GC GC

Page 30: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.2Next version

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>30

http://www.flickr.com/photos/adafruit/8483990604

Page 31: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Schedule of Ruby 2.2

• Not published officially

• Schedule draft is available by Naruse-san• https://bugs.ruby-lang.org/projects/ruby-

trunk/wiki/ReleaseEngineering22

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>31

Page 32: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.2 schedule

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>32

2014/12/25Ruby 2.2.0

RubyKaigi9/18, 19, 20

RubyConf11/17, 18, 19Rubyconf.tw

4/25, 26

Rubyconf.PH3/28, 29

We are here!2013/12

Ruby 2.1.0

RDRC6/26, 27

Events are important forEDD (Event Driven Development) Developers

Page 33: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Ruby 2.2 (rough) schedule

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>33

2014/12/25Ruby 2.2.0

2013/12Ruby 2.1.0

Sep/2014Preview 1

Big feature freeze

Nov/2014Preview2

Feature freeze

Dec/2014Release

candidate

Bug fix only

Critical Bug fix only

We are here!

Page 34: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

2.2 big features (planned)

• New syntax: not available now

• New method: not available now

• Internal• GC

• Symbol GC (merged recently)

• 2age promotion strategy for RGenGC

• Incremental GC to reduce major GC pause time

• VM• More sophisticated method cache

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>34

Page 35: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Symbol GC

• Symbols remain forever → Security issue• “n.times{|i| i.to_s.to_sym}”

creates “n” symbols and they are never collected

• Symbol GC: Collect dynamically created symbols

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>35

Page 36: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

http://www.flickr.com/photos/circasassy/6817999189/

Garbage collectionThe automatic memory management

Today’s main subject

From basic to advanced topics

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>36

Page 37: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Automatic memory managementBasic concept• “Object.new” allocate a new object

• “foo” (string literal) also allocate a new object

• Everything are objects in Ruby!

• We don’t need to “de-allocate” objects manually

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>37

Page 38: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Automatic memory managementBasic concept

• Garbage collector recycled “unused” objects automatically

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>38

Page 39: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

1st question

How to collect“unused” objects?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>39

Page 40: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

How to collect “unused” objects?

• Using (well-known) GC algorithm• Mark and sweep algorithm (from the first version of Ruby)

• Generational GC algorithm (from Ruby 2.1)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>40

http://www.flickr.com/photos/mirsasha/5644819639/

Page 41: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

marked

marked marked

markedmarked

Mark & Sweep algorithm

1. Mark reachable objects from root objects

2. Sweep unmarkedobjects (collection and de-allocation)

Root objects

free

traverse

traverse traverse

traverse traverse

free

free

Collect unreachable objects

41Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 42: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Generational GC (GenGC)•Weak generational hypothesis:

“Most objects die young”

→ Concentrate reclamation effort

only on the young objects42

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>

http://www.flickr.com/photos/ell-r-brown/5026593710

Page 43: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Generational hypothesis

0

10

20

30

40

50

60

70

80

90

100

0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102

Perc

enta

ge o

f d

ead

ob

ject

#

Lifetime (Survibing GC count)

Object lifetime in RDoc(How many GCs surviving?)

95% of objects dead by the first GC

43Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 44: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Generational hypothesis

0

10

20

30

40

50

60

70

80

90

100

0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102

Perc

enta

ge o

f d

ead

ob

ject

#

Lifetime (Survibing GC count)

Object lifetime in RDoc(How many GCs survive?)

T_OBJECT T_CLASS T_MODULE T_STRING T_REGEXP

T_ARRAY T_HASH T_STRUCT T_BIGNUM T_FILE

T_DATA T_MATCH T_NODE T_ICLASS

Some type of objects (like Class) has long lifetime

44Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 45: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Generational GC (GenGC)

• Separate young generation and old generation• Create objects as young generation

• Promote to old generation after surviving n-th GC

• In CRuby, n == 1 (after 1 GC, objects become old)

• Usually, GC on young space (minor GC)

• GC on both spaces if no memory (major/full GC)

45Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 46: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Generational GC (GenGC)

• Minor GC and Major GC can use different GC algorithm• Popular combination is:

Minor GC: Copy GC, Major GC: M&S

• On the CRuby, we choose:

Minor GC: M&S, Major GC: M&S

• Because of CRuby’s restriction (we can’t use moving algorithm)

46Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 47: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GenGC [Minor M&S GC] (1/2)

• Mark reachable objects from root objects.• Mark and promote to old

generation• Stop traversing after old

objects

→ Reduce mark overhead

• Sweep not (marked or old) objects

• Can’t collect Some unreachable objects

Root objects

new

new new

new/free

newnew

traverse

traverse traverse

traverse traverse

new/free

old/free

Don’t collect old objecteven if it is unreachable.

collect

1st MinorGC

47

old

old old

oldold

Page 48: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GenGC [Minor M&S GC] (2/2)

• Mark reachable objects from root objects.• Mark and promote to old

generation• Stop traversing after old

objects

→ Reduce mark overhead

• Sweep not (marked or old) objects

• Can’t collect Some unreachable objects

Root objects

old

old old

new/free

oldold

traverse

ignore ignore

ignore ignore

new/free

old/free

Don’t collect old objecteven if it is unreachable.

collect

2nd MinorGC

48Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 49: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GenGC [Major M&S GC]

• Normal M&S

• Mark reachable objects from root objects• Mark and promote to old gen

• Sweep unmarked objects

• Sweep all unreachable (unused) objects

Root objects

new

old new

new/free

oldold

traverse

traverse traverse

traverse traverse

new/free

old/free

collect

collect

49Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>

Page 50: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

NOTE: Generational GC details

• Skip details of generational GC• Remember set

• Write barrier

• RGenGC techniques

• See my previous slides for details• http://www.atdot.net/~ko1/activities/#idx4

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>50

Page 51: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

2nd question

“When”should we collect objects?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>51

Page 52: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

“When” collect objects?

1. Object space is full

2. Exceed limit of Malloc’ed memory size

3. User specified timing (GC.start, etc)

• (1) and (3) is easy to understand

• (2) needs more explanation

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>52

Page 53: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Exceed limit of Malloc’ed memory size

• When many memories are allocated by “malloc()”

• Introduce two variables• a counter “malloc_increase”• a threshold value “malloc_limit” (16MB)

• Rule• (1) Increase “malloc_increase” by malloc’ed size• (2) “malloc_increase” is reset at every GC time→ “malloc_increase” represents “how many memory allocated (by malloc()) without GC”

• If “malloc_increase” > “malloc_limit”, then invoke GC to recycle malloc’ed objects

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>53

Page 54: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Exceed limit of Malloc’ed memory size

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>54

0

5

10

15

20

25

30

35

1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100103106109112115118

increase(2.1) limit(2.1)

Invoke GC

Page 55: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

3rd question

“What happen”when no space after GC?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>55

Page 56: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

What happen when no space after GC?• Terminology

• Total slots: total prepared object places

• Living objects: Used objects

• GC detects “No Space” just after sweeping

if [# of Total slots] * 0.7 < [# of Living objects]

• Allocate new space expand current space x1.8

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>56

Page 57: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

What happen when no space after GC?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>57

# of living objects (after sweeping)

# of total slots

x1.8

time

Exceeds0.7 * [# of total slots]

Page 58: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Trade-off

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>58

Page 59: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Speed-Memory Trade-off

Performance• Many GCs slow application

performance

Memory usage• Few GC increase memory

consumption

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>59

http://www.flickr.com/photos/mcerasoli/6484117955/

V.S.

Page 60: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Speed-Memory Trade-off

• Usually no problem

• On big production application, this can be an issue

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>60

Page 61: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Speed-Memory Trade-off

• Solution 1: Use big memory machine

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>61

Page 62: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Speed-Memory Trade-off

• Solution 1: Use big memory machine• Recent price of memory is very cheep

• Heroku provides “PX: Performance dyno” (6GB)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>62

https://blog.heroku.com/archives/2014/2/3/heroku-xl

Advertisement

Page 63: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Speed-Memory Trade-off

• Solution 2: Find out good points• Choose good “GC tuning parameters”

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>63

Page 64: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC tuning parameters

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>64

Page 65: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC tuning parameters

• There are several GC tuning parameters• Specified by environment variables

• Use like that: $ RUBY_GC_INIT_SLOTS=10000 ruby script.rb

• Affect only launched time

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>65

Page 66: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC tuning parameters

•How many GC parameters now?• Please raise your hand if you think it is:

① 3② 7③ 10④ 11⑤ 13

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>66

Page 67: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC tuning parameters

•How many GC parameters now?• Please raise your hand if you think it is:

① 3 (ruby 1.9)② 7③ 10 (ruby 2.1.0)④ 11 (ruby 2.1.1) ← Now!!⑤ 13

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>67

Page 68: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC tuning parameters (Ruby 2.1.1)

1. RUBY_GC_HEAP_INIT_SLOTS

2. RUBY_GC_HEAP_FREE_SLOTS

3. RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)

4. RUBY_GC_HEAP_GROWTH_MAX_SLOTS (new from 2.1)

5. RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR (new from 2.1.1)

6. RUBY_GC_MALLOC_LIMIT

7. RUBY_GC_MALLOC_LIMIT_MAX (new from 2.1)

8. RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (new from 2.1)

9. RUBY_GC_OLDMALLOC_LIMIT (new from 2.1)

10. RUBY_GC_OLDMALLOC_LIMIT_MAX (new from 2.1)

11. RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR (new from 2.1)

• Obsolete• RUBY_FREE_MIN -> RUBY_GC_HEAP_FREE_SLOTS (from 2.1)• RUBY_HEAP_MIN_SLOTS -> RUBY_GC_HEAP_INIT_SLOTS (from 2.1)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>68

Page 69: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC_HEAP_INIT/FREE_SLOTS

• RUBY_GC_HEAP_INIT_SLOTS (default: 10000)• How many slots prepared at initialize

• RUBY_GC_HEAP_FREE_SLOTS (default: 4096)• At least how many slots are available after GC• free_min = max(RUBY_GC_HEAP_FREE_SLOTS , total_slots * 0.3)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>69

# of living objects

# of total slots

time

RUBY_GC_HEAP_INIT_SLOTSfree_min

x1.8

Page 70: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)

• RUBY_GC_HEAP_GROWTH_FACTOR (default: 1.8)• Growth factor of expanding object space

• Grow object space exponentially to reduce GC time

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>70

# of living objects

# of total slots

time

free_min

total_slots = total_slots * RUBY_GC_HEAP_GROWTH_FACTOR

Page 71: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

GC_HEAP_GROWTH_MAX_SLOTS (new from Ruby 2.1)

• GC_HEAP_GROWTH_MAX_SLOTS (default: 0)• Stop exponential expanding, start linear expanding

• The value “0” remove this cap

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>71

time

y=x1.8

y=x*C

GC_HEAP_GROWTH_MAX_SLOTS

# of total slots

Page 72: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR (from Ruby 2.1.1)

• RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR• Default value: 2.0

• Tuning major (full) GC frequency• Bigger value: rare, Smaller value: frequent

• < 1.0: Every GC will be major (full) GC

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>72

# of old objects

OLDOBJECT_LIMIT

time

OLDOBJECT_LIMIT =[# of old objects] * RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR

Invoke major GCwhen OLDOBJECT_LIMIT < [# of old objects]

Page 73: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RUBY_GC_MALLOC_LIMIT(…)

• RUBY_GC_MALLOC_LIMIT (default: 16MB)• Initial value of “malloc_limt”

• Tuning GC frequency• Bigger: rare → High throughput, but consumes memory

• Smaller: frequent → Low throughput, small memory

• RUBY_GC_MALLOC_LIMIT_MAX (default: 32MB)• Maximum value of “malloc_limit”

• RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (default: 1.4)• Growth ratio of “malloc_limit”

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>73

Page 74: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RUBY_GC_MALLOC_LIMIT(…)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>74

0

5

10

15

20

25

30

35

1 5 9

13

17

21

25

29

33

37

41

45

49

53

57

61

65

69

73

77

81

85

89

93

97

10

1

10

5

10

9

11

3

11

7

increase(2.1) limit(2.1)

RUBY_GC_MALLOC_LIMIT(= 16MB)

malloc_limit = malloc_limit *RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (= 1.4)

RUBY_GC_MALLOC_LIMIT_MAX (= 32MB)

Page 75: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

RUBY_GC_OLDMALLOC_LIMIT(…)

• RUBY_GC_OLDMALLOC_LIMIT (default: 16MB)

• RUBY_GC_OLDMALLOC_LIMIT_MAX (default: 128MB)

• RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR (default: 1.2)

• Similar to RUBY_GC_MALLOC_LIMIT(…), but parameter for major (full) GC timing

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>75

Page 76: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

4th question

How to use tuning parameters?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>76

Page 77: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

How to use tuning parameters?

1. Profile your application

2. Try GC parameters (environment variables)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>77

http://www.flickr.com/photos/nasa_goddard/5188180370

Page 78: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory managementGC.stat (MRI specific)• “GC.stat” returns statistics information about GC

• Counts• :count=>2, # GC count• :minor_gc_count=>2, # minor GC count• :major_gc_count=>0, # major GC count

• Current slot information• :heap_live_slot=>6836, #=> # of live objects• :heap_free_slot=>519, #=> # of freed objects• :heap_final_slot=>0, #=> # of waiting finalizer objects• total_slots = heap_live_slot + heap_free_slot + heap_final_slot

• Statistics• :total_allocated_object=>7674, # total allocated objects• :total_freed_object=>838, # total freed objects• Current living objects = total_allocated_object - total_freed_object

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>78

Page 79: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory managementGC.latest_gc_info (MRI specific)• “GC.latest_gc_info” returns details of latest GC

• :gc_by=>:newobj # why GC invoked?• newobj: no slots available

• malloc: malloc_increase > malloc_limit

• :major_by=>nil # why major GC invoked?

• :have_finalizer=>false # have finalizer?

• :immediate_sweep=>false # immediate sweep?

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>79

Page 80: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem (MRI 2.1.0 later!!)

• GC::Tracer.start_logging(filename)• Save all GC.stat/GC.latest_gc_info results at every GC events

into specified file

• GC events:• Start

• End marking

• End sweeping

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>80

Sweep Sweep

GC start

GC end marking

GC end sweepingMark Sweep Sweep

GC start

GC end marking

GC end sweepingMark

Page 81: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem• Run your application with gc_tracer

• Plot with Excel!

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>81

http://www.flickr.com/photos/microsoftsweden/5394685465

Page 82: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>82

0

20

40

60

80

100

120

1 7

13

19

25

31

37

43

49

55

61

67

73

79

85

91

97

10

3

10

9

11

5

12

1

12

7

13

3

13

9

14

5

15

1

15

7

16

3

16

9

17

5

18

1

18

7

19

3

19

9

20

5

21

1

21

7

22

3

22

9

23

5

24

1

24

7

25

3

25

9

26

5

27

1

27

7

minor_gc_count major_gc_count

Page 83: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>83

0

5,000,000

10,000,000

15,000,000

20,000,000

25,000,000

30,000,000

35,000,000

40,000,000

1 7

13

19

25

31

37

43

49

55

61

67

73

79

85

91

97

10

3

10

9

11

5

12

1

12

7

13

3

13

9

14

5

15

1

15

7

16

3

16

9

17

5

18

1

18

7

19

3

19

9

20

5

21

1

21

7

22

3

22

9

23

5

24

1

24

7

25

3

25

9

26

5

27

1

27

7

total_allocated_object total_freed_object

Page 84: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>84

0

100,000

200,000

300,000

400,000

500,000

600,000

700,000

800,000

900,000

1,000,000

1 7

13

19

25

31

37

43

49

55

61

67

73

79

85

91

97

10

3

10

9

11

5

12

1

12

7

13

3

13

9

14

5

15

1

15

7

16

3

16

9

17

5

18

1

18

7

19

3

19

9

20

5

21

1

21

7

22

3

22

9

23

5

24

1

24

7

25

3

25

9

26

5

27

1

27

7

total_slots heap_swept_slot

Page 85: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>85

0

200000

400000

600000

800000

1000000

1200000

1400000

1600000

1 7

13

19

25

31

37

43

49

55

61

67

73

79

85

91

97

10

3

10

9

11

5

12

1

12

7

13

3

13

9

14

5

15

1

15

7

16

3

16

9

17

5

18

1

18

7

19

3

19

9

20

5

21

1

21

7

22

3

22

9

23

5

24

1

24

7

25

3

25

9

26

5

ruby 2.2 dev/RUBY_GC_HEAP_OLDOBJECT_FACTOR=2.0 (default)

total_slots old_object old_object_limit

Page 86: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Profile memory management“gc_tracer” gem

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>86

0

100000

200000

300000

400000

500000

600000

700000

800000

900000

1000000

1 7

13

19

25

31

37

43

49

55

61

67

73

79

85

91

97

10

3

10

9

11

5

12

1

12

7

13

3

13

9

14

5

15

1

15

7

16

3

16

9

17

5

18

1

18

7

19

3

19

9

20

5

21

1

21

7

22

3

22

9

23

5

24

1

24

7

25

3

25

9

26

5

27

1

27

7

Ruby 2.2dev w/ RUBY_GC_HEAP_OLDOBJECT_FACTOR=1.3

total_slots old_object old_object_limit

Page 87: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Try GC parameters

• General concept

Speed <-> Memory trade-off

• You have huge memory

→ Increase parameters to improve performance

• RUBY_GC_HEAP_INIT_SLOTS (initial slots)

• RUBY_GC_HEAP_FREE_SLOTS (prepared free slots after GC)

• RUBY_GC_MALLOC_LIMIT (reduce GC frequency)

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>87

Page 88: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Try GC parameters

• You have small memory

Reduce parameters to reduce memory usage

• IaaS, PaaS environments (ex: Heroku 1X dyno (512MB))

• RUBY_GC_HEAP_GROWTH_FACTOR (heap expanding factor)

• RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR (for more full GC)

• If you have memory usage trouble when migrating from 2.0 to 2.1, please try to reduce this variable

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>88

Or you can tryHeroku 2X dyno (1GB) / PX dyno (6GB)!!

Advertisement

Page 89: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Try GC parameters

• There is no silver bullet• No one answer for all applications

• You should not believe other applications settings easily

• Try and try and try!

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>89

http://www.flickr.com/photos/rowanbank/8483526808

Page 90: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

See also

• Excellent blog articles by @tmm1• http://tmm1.net/

• Demystifying the Ruby GC by Sam Saffron• http://samsaffron.com/archive/2013/11/22/demystifyin

g-the-ruby-gc

• Why I am excited about Ruby 2.1? by Sam Saffron • https://speakerdeck.com/samsaffron/why-ruby-2-dot-1-

excites-me

• http://vimeo.com/89491942

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>90

Page 91: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Summary of this talk

• New versions• Ruby 2.1 (released)

• Ruby 2.2 (currently working on)

• Basic of Ruby’s memory management (GC)

• GC tuning parameters• “What” and “How” we can tune by GC parameters

Memory management tuning in Ruby, RubyConfPH 2014 by K.Sasada

<[email protected]>91

Page 92: Memory management tuning in Rubyko1/activities/2014_rubyconf_ph_pub.pdfMemory management tuning in Ruby Koichi Sasada  Memory management tuning in Ruby, RubyConfPH

Thank you for your attentionQ&A?

Koichi Sasada<[email protected]>

92Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <[email protected]>