Feature #2328: malloc_limit の肥大化を防ぎたい
http://redmine.ruby-lang.org/issues/show/2328起票者: _ wanabe
ステータス: Open, 優先度: Normal
カテゴリ: core, Target version: 1.9.x
何らかの原因で malloc_limit が肥大化してしまうと、GC のタイミングが遅れて
Bug #1325 のように異常なほどのスワップや NoMemoryError を引き起こしかねません。
改善案としてパッチを二つ書きました。よろしければご検討ください。
また、このパッチが問題になるケースがあれば教えていただけるとありがたいです。
1. vm_xrealloc() での malloc_increase のチェックおよび増加量の抑制
vm_xrealloc() では、malloc_increase は上限チェック無しで増加しており、
これは上記の問題につながります。
単純に vm_xmalloc() と同様の上限チェックを行うと GC が起こりすぎるので、
malloc_increase の増加量を、それまでの増加量の平均値(よりやや小さい値)だけ
抑制することで、メモリ使用量の近似値を取り、GC 回数を減らしました。
2. GC ごとの malloc_limit の直接的な減少
1. の対策をとっても、例えば malloc_increase が上限に近いときに大きなサイズの
malloc がされることが続いた場合、malloc_limit は減少することなく増加し続けます。
膨大なメモリを使う場合やプロセスの寿命が長い場合は特に蓄積量が大きいと思われます。
この対策として、GC のたびに malloc_limit を何割かずつ減らすのはどうでしょうか。
パッチでは 1/16 ほどの値を減らしています。
----------------------------------------
http://redmine.ruby-lang.org