Forum: Ruby-dev longlife gc

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9f859654c118bcd2f67cc763baf0de7a?d=identicon&s=25 Narihiro Nakamura (Guest)
on 2009-05-10 17:21
(Received via mailing list)
Attachment: gc_partial_longlife_r23386.patch (30 KB)
Attachment: bm_gc_app_heapstyle_maker.rb (636 Bytes)
nariと申します.

GW中にGCの改良を行いましたので,報告いたします.

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

調査前は漠然と「文字列が一番多いんじゃないかなぁ」と考えていたのですが,実際に
は構文木オブジェクトがヒープの半分を占めているようです.
その構文木オブジェクトを更に詳しく調べたグラフが以下です.
http://www.narihiro.info/resource/image/gc_count_s...

このグラフにある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へのパッチを作成しました.
本メールに添付しております.

よろしくお願いいたします.
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2009-05-10 17:43
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m!w(BEuruko$B:G=*F|$G$9(B

In message "Re: [ruby-dev:38423] longlife gc"
    on Mon, 11 May 2009 00:20:38 +0900, Narihiro Nakamura
<authornari@gmail.com> writes:

|GW$BCf$K(BGC$B$N2~NI$r9T$$$^$7$?$N$G!$Js9p$$$?$7$^$9!%(B

$B;d$,@z$C$?$3$H$b$"$j$^$9$,!"0-$/$J$k%1!<%9$,$J$$(B or $B>/$J$$$N(B
$B$G$"$l$P<h$j9~$_$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?(B
$B$@$1$k%\%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+(Bbenchmark$B$N2<$r(B
$B;n$7$F$_$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#(B
308cbef6e86dfc49cce3b2d4cf42aedc?d=identicon&s=25 SASADA Koichi (Guest)
on 2009-05-10 20:54
(Received via mailing list)
$B!!$5$5$@$G$9!%(B

Narihiro Nakamura wrote::
> 
$B$3$N%0%i%U$K$"$k(BNODE_METHOD$B$d(BNODE_CFUNC$B!$(BNODE_FBODY$B$O%a%=%C%IDj5A$N:]$K(B
> 
$B;HMQ$5$l!$(BNODE_WHILE$B$d(BNODE_BLOCK$B$O(BVM$B$NFbIt$G;HMQ$5$l$F$$$k$h$&$G$9!%(B

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

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

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

$B!!$?$@!$$=$l$OB?J,(B 1.9.2
$B0J9_$K$J$k$s$@$m$&$J$!!$$H$$$&$3$H$G!$LdBj$,L5(B
$B$$$N$J$i!$:#2s$N%Q%C%A!J<B$OItJ,E*@$BeJL(BGC$B$,2?$+$o$+$C$F$$$J$$!K$OM-MQ$+(B
$B$H;W$$$^$9!%(B
9f859654c118bcd2f67cc763baf0de7a?d=identicon&s=25 Narihiro Nakamura (Guest)
on 2009-05-11 15:05
(Received via mailing list)
nari$B$G$9!%(B

2009/05/11 0:39 Yukihiro Matsumoto <matz@ruby-lang.org>:
> $B;n$7$F$_$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#(B
>
>

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

$B$h$m$7$/$*4j$$$$$?$7$^$9!%(B
9f859654c118bcd2f67cc763baf0de7a?d=identicon&s=25 Narihiro Nakamura (Guest)
on 2009-05-11 15:11
(Received via mailing list)
nari$B$G$9!%(B

2009/05/11 3:52 SASADA Koichi <ko1@atdot.net>:
> $B!!$5$5$@$G$9!%(B
>
(snip)
> $B!!A0$b8@$$$^$7$?$,!$$3$NJU$N%$%s%i%$%s%-%c%C%7%e$d$i$N%N!<%I$H$+$=$NJU(B
> $B$O!$(BGC $BBP>]30NN0h$K$7$F$7$^$*$&$H;W$C$F$$$^$9!%(B
>
$B$=$&$G$7$?$+!%(B
$B$=$A$i$NJ}$,@-G=$,NI$5$=$&$G$9$M!%(B

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

$BItJ,E*@$BeJL(BGC$B$H$$$&8@MU$O3d$H<+J,$G:n$C$F$7$^$C$?46$8$G$9!%(B
$BFCDj$N%*%V%8%'%/%H$KBP$7$F$N$_@$BeJL(BGC$B$C$]$$F0$-$r$9$k$N$G!$$3$&$$$&8@$$J}$r(B
$B$7$?$N$G$9$,!$5U$K$o$+$j$E$i$+$C$?$+$b$7$l$^$;$s!%(B
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2009-05-13 08:22
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:38424] Re: longlife gc"
    on Mon, 11 May 2009 00:39:12 +0900, Yukihiro Matsumoto
<matz@ruby-lang.org> writes:

|In message "Re: [ruby-dev:38423] longlife gc"
|    on Mon, 11 May 2009 00:20:38 +0900, Narihiro Nakamura <authornari@gmail.com> writes:
|
||GW$BCf$K(BGC$B$N2~NI$r9T$$$^$7$?$N$G!$Js9p$$$?$7$^$9!%(B
|
|$B;d$,@z$C$?$3$H$b$"$j$^$9$,!"0-$/$J$k%1!<%9$,$J$$(B or $B>/$J$$$N(B
|$B$G$"$l$P<h$j9~$_$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?(B
|$B$@$1$k%\%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+(Bbenchmark$B$N2<$r(B
|$B;n$7$F$_$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#(B

benchmark$B0J2<$N%9%/%j%W%H$G;n$7$F$_$^$7$?!#$H$j$"$($:7kO@$H$7(B
$B$F$O!V$"$^$jCY$/$J$C$F$J$$!W$H$$$&$b$N$G$9!#$^$"!"$;$$$<$$(B
0.2$BIC$H$+$=$l$/$i$$!#5U$K(BAO$B%Y%s%A$J$I$G$O$:$$$V$sAa$/$J$C$?%1!<(B
$B%9$b$"$k$h$&$J$N$G!"<h$j9~$s$G$b$h$$$N$G$O$J$$$G$7$g$&$+!#(B
9f859654c118bcd2f67cc763baf0de7a?d=identicon&s=25 Narihiro Nakamura (Guest)
on 2009-05-13 16:08
(Received via mailing list)
nari$B$G$9!%(B

2009/05/13 15:21 Yukihiro Matsumoto <matz@ruby-lang.org>:
> |$B;d$,@z$C$?$3$H$b$"$j$^$9$,!"0-$/$J$k%1!<%9$,$J$$(B or $B>/$J$$$N(B
> |$B$G$"$l$P<h$j9~$_$?$$$H;W$$$^$9!#$$$m$$$m$J%1!<%9$G;n$7$F$$$?(B
> |$B$@$1$k%\%i%s%F%#%"$rJg=8$7$^$9!#;d$b$$$/$D$+(Bbenchmark$B$N2<$r(B
> |$B;n$7$F$_$h$&$H;W$$$^$9$,!"$$$D;~4V$,<h$l$k$+J,$+$i$J$$$N$G!#(B
>
> benchmark$B0J2<$N%9%/%j%W%H$G;n$7$F$_$^$7$?!#$H$j$"$($:7kO@$H$7(B
> $B$F$O!V$"$^$jCY$/$J$C$F$J$$!W$H$$$&$b$N$G$9!#$^$"!"$;$$$<$$(B
> 0.2$BIC$H$+$=$l$/$i$$!#5U$K(BAO$B%Y%s%A$J$I$G$O$:$$$V$sAa$/$J$C$?%1!<(B
> $B%9$b$"$k$h$&$J$N$G!"<h$j9~$s$G$b$h$$$N$G$O$J$$$G$7$g$&$+!#(B
>
>

$B$"$j$,$H$&$4$6$$$^$9!%(B
$B%3%_%C%H$7$F$*$-$^$9!%(B
B11f10c4cd9d53970e7be20caa43f940?d=identicon&s=25 Tanaka Akira (Guest)
on 2009-05-13 23:06
(Received via mailing list)
In article
<1153cee60905130638v7639a6a3w67b9006c6912fc60@mail.gmail.com>,
  Narihiro Nakamura <authornari@gmail.com> writes:

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

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

Segmentation fault:
http://www.rubyist.net/~akr/chkbuild/debian/ruby-t...

Bus Error:
http://chkbuild.n-z.jp/ruby/ppc-mac-mini/ruby-trun...
9f859654c118bcd2f67cc763baf0de7a?d=identicon&s=25 Narihiro Nakamura (Guest)
on 2009-05-14 03:57
(Received via mailing list)
nari$B$G$9!%(B

2009/05/14 6:05 Tanaka Akira <akr@fsij.org>:
> Bus Error:
> http://chkbuild.n-z.jp/ruby/ppc-mac-mini/ruby-trun...

$B$&$%!$$9$_$^$;$s!%(B
$BD4::$7$^$9!%(B
This topic is locked and can not be replied to.