memory management tuning in rubyko1/activities/2014_rubyconf_ph_pub.pdfmemory management tuning in...

Post on 11-Mar-2018

235 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Memory management tuning in Ruby

Koichi Sasada<ko1@heroku.com>

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

<ko1@heroku.com>1

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

<ko1@heroku.com>2

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 <ko1@heroku.com>

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 <ko1@heroku.com>

• 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 <ko1@heroku.com>

• 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 <ko1@heroku.com>

This talk is also sponsored

by Heroku!

“Matz team” in Heroku

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

<ko1@heroku.com>7

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

<ko1@heroku.com>

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

<ko1@heroku.com>

[Not stupid boss]

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 <ko1@heroku.com>

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

<ko1@heroku.com>11

NobuPatch monster• Great patch creator

12Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <ko1@heroku.com>

NobuPatch monster

13Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <ko1@heroku.com>

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

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

<ko1@heroku.com>

EDD: Event Driven Development

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

<ko1@heroku.com>15

Ruby 2.1Current stable

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

<ko1@heroku.com>16

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

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

<ko1@heroku.com>17

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

<ko1@heroku.com>18

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

<ko1@heroku.com>19

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

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

<ko1@heroku.com>20

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

<ko1@heroku.com>21

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

<ko1@heroku.com>22

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

<ko1@heroku.com>23

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

<ko1@heroku.com>24

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

<ko1@heroku.com>25

Performance improvements

• Optimize “string literal”.freeze

• Sophisticated inline method cache

• Introducing Generational GC: RGenGC

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

<ko1@heroku.com>26

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 <ko1@heroku.com>

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 <ko1@heroku.com>

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

Ruby 2.2Next version

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

<ko1@heroku.com>30

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

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

<ko1@heroku.com>31

Ruby 2.2 schedule

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

<ko1@heroku.com>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

Ruby 2.2 (rough) schedule

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

<ko1@heroku.com>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!

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

<ko1@heroku.com>34

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

<ko1@heroku.com>35

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

<ko1@heroku.com>36

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

<ko1@heroku.com>37

Automatic memory managementBasic concept

• Garbage collector recycled “unused” objects automatically

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

<ko1@heroku.com>38

1st question

How to collect“unused” objects?

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

<ko1@heroku.com>39

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

<ko1@heroku.com>40

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

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 <ko1@heroku.com>

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

<ko1@heroku.com>

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

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 <ko1@heroku.com>

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 <ko1@heroku.com>

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 <ko1@heroku.com>

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 <ko1@heroku.com>

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

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 <ko1@heroku.com>

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 <ko1@heroku.com>

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

<ko1@heroku.com>50

2nd question

“When”should we collect objects?

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

<ko1@heroku.com>51

“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

<ko1@heroku.com>52

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

<ko1@heroku.com>53

Exceed limit of Malloc’ed memory size

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

<ko1@heroku.com>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

3rd question

“What happen”when no space after GC?

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

<ko1@heroku.com>55

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

<ko1@heroku.com>56

What happen when no space after GC?

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

<ko1@heroku.com>57

# of living objects (after sweeping)

# of total slots

x1.8

time

Exceeds0.7 * [# of total slots]

Trade-off

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

<ko1@heroku.com>58

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

<ko1@heroku.com>59

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

V.S.

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

<ko1@heroku.com>60

Speed-Memory Trade-off

• Solution 1: Use big memory machine

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

<ko1@heroku.com>61

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

<ko1@heroku.com>62

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

Advertisement

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

<ko1@heroku.com>63

GC tuning parameters

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

<ko1@heroku.com>64

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

<ko1@heroku.com>65

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

<ko1@heroku.com>66

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

<ko1@heroku.com>67

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

<ko1@heroku.com>68

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

<ko1@heroku.com>69

# of living objects

# of total slots

time

RUBY_GC_HEAP_INIT_SLOTSfree_min

x1.8

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

<ko1@heroku.com>70

# of living objects

# of total slots

time

free_min

total_slots = total_slots * RUBY_GC_HEAP_GROWTH_FACTOR

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

<ko1@heroku.com>71

time

y=x1.8

y=x*C

GC_HEAP_GROWTH_MAX_SLOTS

# of total slots

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

<ko1@heroku.com>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]

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

<ko1@heroku.com>73

RUBY_GC_MALLOC_LIMIT(…)

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

<ko1@heroku.com>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)

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

<ko1@heroku.com>75

4th question

How to use tuning parameters?

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

<ko1@heroku.com>76

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

<ko1@heroku.com>77

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

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

<ko1@heroku.com>78

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

<ko1@heroku.com>79

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

<ko1@heroku.com>80

Sweep Sweep

GC start

GC end marking

GC end sweepingMark Sweep Sweep

GC start

GC end marking

GC end sweepingMark

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

<ko1@heroku.com>81

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

Profile memory management“gc_tracer” gem

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

<ko1@heroku.com>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

Profile memory management“gc_tracer” gem

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

<ko1@heroku.com>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

Profile memory management“gc_tracer” gem

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

<ko1@heroku.com>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

Profile memory management“gc_tracer” gem

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

<ko1@heroku.com>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

Profile memory management“gc_tracer” gem

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

<ko1@heroku.com>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

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

<ko1@heroku.com>87

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

<ko1@heroku.com>88

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

Advertisement

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

<ko1@heroku.com>89

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

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

<ko1@heroku.com>90

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

<ko1@heroku.com>91

Thank you for your attentionQ&A?

Koichi Sasada<ko1@heroku.com>

92Memory management tuning in Ruby,

RubyConfPH 2014 by K.Sasada <ko1@heroku.com>

top related