Longlife gc


#1

nariと申します.

GW中にGCã®æ”¹è‰¯ã‚’è¡Œã„ã¾ã—ãŸã®ã§ï¼Œå ±å‘Šã„ãŸã—ã¾ã™ï¼Ž

= Railsのヒープ調査
2ヶ月ほど前に,ふと気になってRailsがどんな風にヒープを使用しているか調査してみました.
以下のグラフはscaffoldしたRailsアプリを動かした際のものです.

èª¿æŸ»å‰ã¯æ¼ ç„¶ã¨ã€Œæ–‡å­—åˆ—ãŒä¸€ç•ªå¤šã„ã‚“ã˜ã‚ƒãªã„ã‹ãªãã€ã¨è€ƒãˆã¦ã„ãŸã®ã§ã™ãŒï¼Œå®Ÿéš›ã«
ã¯æ§‹æ–‡æœ¨ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒãƒ’ãƒ¼ãƒ—ã®åŠåˆ†ã‚’å ã‚ã¦ã„ã‚‹ã‚ˆã†ã§ã™ï¼Ž
その構文木オブジェクトを更に詳しく調べたグラフが以下です.

このグラフにあるNODE_METHODやNODE_CFUNC,NODE_FBODYはメソッド定義の際に
使用され,NODE_WHILEやNODE_BLOCKはVMの内部で使用されているようです.

= 長寿命GC
更に調査をすると,これらのオブジェクトはとても長生きな事が分かりました.
ãã“ã§ï¼Œã“ã‚Œã‚‰ã‚’é•·å¯¿å‘½é ˜åŸŸã«éš”é›¢ã—ã¦ã—ã¾ãŠã†ï¼Œã¨ã„ã†æ”¹å–„ã‚’ä»Šå›žè¡Œã„ã¾ã—ãŸï¼Ž
部分的な世代別GCというイメージです.
このアイデアは,まつもとさんからアドバイスしていただいたものです.

= 実装メモ
major gcを行うタイミングはヒープが拡張される時とGC.startの時にしています.
ライトバリアの手法にはremembered_setを使いました.オブジェクトがライト
バリアにあることを示す為に FL_RESERVED フラグを使用しています.

= ベンチマーク
scaffoldしただけのRailsアプリでGCのプロファイルを取りました.
GC回数
改善前 : 35
改善後 : 31

総GC時間(ms)
改善前 : 332.02
改善後 : 284.01

平均GC時間(ms)
改善前 : 9.48
改善後 : 9.16

また,Railsアプリのヒープの状態を作り出すようなベンチマークコードを書い
て,そのプロファイルも取りました.
GC回数
改善前 : 7
改善後 : 6

総GC時間(ms)
改善前 : 1452.09
改善後 : 1208.07

平均GC時間(ms)
改善前 : 207.44
改善後 : 201.34

使用したコードは本メールに添付しております.

= パッチ
現在の最新のrevisionへのパッチとruby1.9.1-p0へのパッチを作成しました.
本メールに添付しております.

よろしくお願いいたします.


#2

e$B$^$D$b$He(B e$B$f$-$R$m!we(BEurukoe$B:G=*F|$G$9e(B

In message “Re: [ruby-dev:38423] longlife gc”
on Mon, 11 May 2009 00:20:38 +0900, Narihiro N.
removed_email_address@domain.invalid writes:

|GWe$BCf$Ke(BGCe$B$N2~NI$r9T$$$^$7$?$N$G!$Js9p$$$?$7$^$9!%e(B

e$B;d$,@z$C$?$3$H$b$"$j$^$9$,!“0-$/$J$k%1!<%9$,$J$$e(B or e$B>/$J$$$Ne(B
e$B$G$”$l$P<h$j9~$$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?e(B
e$B$@$1$k%%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+e(Bbenchmarke$B$N2<$re(B
e$B;n$7$F$
$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#e(B


#3

e$B!!$5$5$@$G$9!%e(B

Narihiro N. wrote::

e$B$3$N%0%i%U$K$"$ke(BNODE_METHODe$B$de(BNODE_CFUNCe$B!$e(BNODE_FBODYe$B$O%a%=%C%IDj5A$N:]$Ke(B
e$B;HMQ$5$l!$e(BNODE_WHILEe$B$de(BNODE_BLOCKe$B$Oe(BVMe$B$NFbIt$G;HMQ$5$l$F$$$k$h$&$G$9!%e(B

e$B!!$*Hh$lMM$G$9!%$9$P$i$7$$%G!<%?$@$H;W$$$^$9!%e(B

= e$BD9<wL?e(BGC
e$B99$KD4::$r$9$k$H!$$3$l$i$N%%V%8%’%/%H$O$H$F$bD9@8$-$J;v$,J,$+$j$^$7$?!%e(B
e$B$=$3$G!$$3$l$i$rD9<wL?NN0h$K3VN%$7$F$7$^$
$&!$$H$$$&2~A1$r:#2s9T$$$^$7$?!%e(B
e$BItJ,E*$J@$BeJLe(BGCe$B$H$$$&%$%a!<%8$G$9!%e(B
e$B$3$N%"%$%G%"$O!$$^$D$b$H$5$s$+$i%"%I%P%$%9$7$F$$$?$@$$$?$b$N$G$9!%e(B

e$B!!A0$b8@$$$^$7$?$,!$$3$NJU$N%$%s%i%$%s%-%c%C%7%e$d$i$N%N!<%I$H$+$=$NJUe(B
e$B$O!$e(BGC e$BBP>]30NN0h$K$7$F$7$^$*$&$H;W$C$F$$$^$9!%e(B

e$B!!$?$@!$$=$l$OB?J,e(B 1.9.2
e$B0J9_$K$J$k$s$@$m$&$J$!!$$H$$$&$3$H$G!$LdBj$,L5e(B
e$B$$$N$J$i!$:#2s$N%Q%C%A!J<B$OItJ,E*@$BeJLe(BGCe$B$,2?$+$o$+$C$F$$$J$$!K$OM-MQ$+e(B
e$B$H;W$$$^$9!%e(B


#4

narie$B$G$9!%e(B

2009/05/11 3:52 SASADA Koichi removed_email_address@domain.invalid:

e$B!!$5$5$@$G$9!%e(B

(snip)

e$B!!A0$b8@$$$^$7$?$,!$$3$NJU$N%$%s%i%$%s%-%c%C%7%e$d$i$N%N!<%I$H$+$=$NJUe(B
e$B$O!$e(BGC e$BBP>]30NN0h$K$7$F$7$^$*$&$H;W$C$F$$$^$9!%e(B

e$B$=$&$G$7$?$+!%e(B
e$B$=$A$i$NJ}$,@-G=$,NI$5$=$&$G$9$M!%e(B

e$B$?$@!$$=$l$OB?J,e(B 1.9.2 e$B0J9_$K$J$k$s$@$m$&$J$!!$$H$$$&$3$H$G!$LdBj$,L5e(B
e$B$$$N$J$i!$:#2s$N%Q%C%A!J<B$OItJ,E*@$BeJLe(BGCe$B$,2?$+$o$+$C$F$$$J$$!K$OM-MQ$+e(B
e$B$H;W$$$^$9!%e(B

e$BItJ,E*@$BeJLe(BGCe$B$H$$$&8@MU$O3d$H<+J,$G:n$C$F$7$^$C$?46$8$G$9!%e(B
e$BFCDj$N%*%V%8%’%/%H$KBP$7$F$N$_@$BeJLe(BGCe$B$C$]$$F0$-$r$9$k$N$G!$$3$&$$$&8@$$J}$re(B
e$B$7$?$N$G$9$,!$5U$K$o$+$j$E$i$+$C$?$+$b$7$l$^$;$s!%e(B


#5

narie$B$G$9!%e(B

2009/05/11 0:39 Yukihiro M. removed_email_address@domain.invalid:

e$B;n$7$F$_$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#e(B

e$B$=$&$G$9$M!%e(B
e$B$3$s$J%1!<%9$GCY$/$J$C$?!$$b$7$/$OAa$/$J$C$?!$$J$I$J$IJs9p$7$FD:$1$k$He(B
e$B4r$7$$8B$j$G$9!%;d$NJ}$b2K$r8+$D$1$F:n6H$7$?$$$H;W$$$^$9!%e(B

e$B$h$m$7$/$*4j$$$$$?$7$^$9!%e(B


#6

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:38424] Re: longlife gc”
on Mon, 11 May 2009 00:39:12 +0900, Yukihiro M.
removed_email_address@domain.invalid writes:

|In message “Re: [ruby-dev:38423] longlife gc”
| on Mon, 11 May 2009 00:20:38 +0900, Narihiro N. removed_email_address@domain.invalid writes:
|
||GWe$BCf$Ke(BGCe$B$N2~NI$r9T$$$^$7$?$N$G!$Js9p$$$?$7$^$9!%e(B
|
|e$B;d$,@z$C$?$3$H$b$"$j$^$9$,!“0-$/$J$k%1!<%9$,$J$$e(B or e$B>/$J$$$Ne(B
|e$B$G$”$l$P<h$j9~$$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?e(B
|e$B$@$1$k%%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+e(Bbenchmarke$B$N2<$re(B
|e$B;n$7$F$
$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#e(B

benchmarke$B0J2<$N%9%/%j%W%H$G;n$7$F$_$^$7$?!#$H$j$"$($:7kO@$H$7e(B
e$B$F$O!V$"$^$jCY$/$J$C$F$J$$!W$H$$$&$b$N$G$9!#$^$"!"$;$$$<$$e(B
0.2e$BIC$H$+$=$l$/$i$$!#5U$Ke(BAOe$B%Y%s%A$J$I$G$O$:$$$V$sAa$/$J$C$?%1!<e(B
e$B%9$b$"$k$h$&$J$N$G!"<h$j9~$s$G$b$h$$$N$G$O$J$$$G$7$g$&$+!#e(B


#7

narie$B$G$9!%e(B

2009/05/13 15:21 Yukihiro M. removed_email_address@domain.invalid:

|e$B;d$,@z$C$?$3$H$b$"$j$^$9$,!“0-$/$J$k%1!<%9$,$J$$e(B or e$B>/$J$$$Ne(B
|e$B$G$”$l$P<h$j9~$$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?e(B
|e$B$@$1$k%%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+e(Bbenchmarke$B$N2<$re(B
|e$B;n$7$F$
$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#e(B

benchmarke$B0J2<$N%9%/%j%W%H$G;n$7$F$_$^$7$?!#$H$j$"$($:7kO@$H$7e(B
e$B$F$O!V$"$^$jCY$/$J$C$F$J$$!W$H$$$&$b$N$G$9!#$^$"!"$;$$$<$$e(B
0.2e$BIC$H$+$=$l$/$i$$!#5U$Ke(BAOe$B%Y%s%A$J$I$G$O$:$$$V$sAa$/$J$C$?%1!<e(B
e$B%9$b$"$k$h$&$J$N$G!"<h$j9~$s$G$b$h$$$N$G$O$J$$$G$7$g$&$+!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!%e(B
e$B%3%_%C%H$7$F$*$-$^$9!%e(B


#8

In article
removed_email_address@domain.invalid,
Narihiro N. removed_email_address@domain.invalid writes:

e$B%3%_%C%H$7$F$*$-$^$9!%e(B

test-all e$B$G0[>o=*N;$9$k$h$&$G$9$M!#e(B

Segmentation fault:
http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20090514T030700.log.txt.gz

Bus Error:
http://chkbuild.n-z.jp/ruby/ppc-mac-mini/ruby-trunk/log/20090514T034826.log.txt.gz


#9

narie$B$G$9!%e(B

2009/05/14 6:05 Tanaka A. removed_email_address@domain.invalid:

Bus Error:
http://chkbuild.n-z.jp/ruby/ppc-mac-mini/ruby-trunk/log/20090514T034826.log.txt.gz

e$B$&$%!$$9$_$^$;$s!%e(B
e$BD4::$7$^$9!%e(B