ruby-trunk-changes r46382 - r46388

今日は GC のヒープ拡張の戦略の変更、32bit AIX での IO#fadvice の対応などがありました。

kanemoto: r46382 2014-06-08 23:39:27 +0900

AIX で 32bit CPU では _LARGE_FILES が定義されていると(定義されてないと、じゃないんですね) posix_fadvise() がサポートされていないので(定義されてないわけではないようで、HAVE_POSIX_FADVISE は定義されるみたい)、条件コンパイルの条件を追加しています。 [ruby-core:62968] [Bug #9914]

nobu: r46383 2014-06-08 23:46:43 +0900

compile.c の static 関数 new_insn_body() で引数 insn_id の型を int ではなくて enum ruby_vminsn_type に変更しています。

nobu: r46384 2014-06-09 00:04:29 +0900

r46382 の再修正。 io.c で条件分岐をいじるのではなくて configure の段階で AIX で 32bit アーキテクチャで $ac_cv_sys_large_files が yes だったら HAVE_POSIX_FADVISE を偽にするようにしています。 とりあえず io.c の分岐もそのまま。 [ruby-core:62968] [Bug #9914]

svn: r46385 2014-06-09 00:04:37 +0900

version.h の日付更新。

nobu: r46386 2014-06-09 16:01:44 +0900

gc.c の関数名 gcdebug_sential() -> gcdebug_sentinel() と typo 修正。 https://github.com/ruby/ruby/pull/634

ko1: r46387 2014-06-09 20:43:23 +0900

RGenGC の世代を3つに分けるのをデフォルトにして slot 数の増加は抑えられたけど、アプリケーションによってはまだ slot 数が多くなってしまうことがるかもしれないとのことで、heaps を拡張(page を追加)するタイミングを変更しています。GC 後に充分な空きスロットがなかったら heaps を拡張していたのを、major GC の後かその直後2回の minor GC でのみ拡張するようにして、かわりに (major GC 後 3回目以降の) minor GC 後に足りない時は次に major GC を実施するようにフラグを立てるようにしています。これまでは全体の slot 数のうち old 世代と shady のオブジェクト数の割合が半分以上になった時に major GC を実施するようにしていたので、比較的頻繁に major GC を実施するようになったということみたいです。 [Bug #9607] https://bugs.ruby-lang.org/issues/9607#note-9
これにより slot 数は小さい数で遷移するようになったので、メモリ使用量は抑えられるみたいで、チケットにはこの変更で GC がより省メモリでパフォーマンスは悪くなる(頻繁に major GC するため)方向にチューニングしたことになるとあります。
ところでチケットの疑似コードの

if major_gc ||
   GC.count - last_major_gc > 2 # (A) extend heap at least 2 minor GC run
  extend_heap
else
  do_major_gc_at_next_gc = true
end

の部分と実際のパッチが微妙にうまく対応していないと思うのですがどっちが正しいんでしょうか…。疑似コードだと「minor GC で前回の major GC からは 3回目以降」で空きスロットが閾値を下回った時はいきなりヒープ拡張で、「minor GC で前回の major GC から 2回目まで」の時は「次回 major GC にする」となっていて、実際の変更はこの逆になっているような気がします。たぶん意図としては実際の変更が正しいような気がしますが(さすがに 1回おきに major GC 連発はおかしい)。
またチケットには AGE2PROMOTION (infant -> young -> old の3つの世代を導入した RGenGC)での young オブジェクト数についてのグラフもあって、ほとんど young のオブジェクトは存在しないという結果を得ているみたいです。 AGE2PROMOTION は old になるのに猶予を与えるためにあるのかなって気がしますが、young が少ないということはあまり効果はないのでしょうか。

nobu: r46388 2014-06-09 23:05:47 +0900

r46331 で追加した Net::IMAP のテストでとても長い行の文字列リテラルがあったので、エスケープした行継続を使って改行するようにしています。