[#47135] [ruby-trunk - Feature #8024][Assigned] Lazy sweep を on/off するための機能 — "mrkn (Kenta Murata)" <muraken@...>
16 messages
2013/03/06
[#47150] [ruby-trunk - Bug #8054][Open] open-uri と resolv-replace を同時にロードすると壊れる — "mrkn (Kenta Murata)" <muraken@...>
4 messages
2013/03/09
[#47157] 1CPUでtest-allするとfiberとFileUtilsでエラーたくさん — KOSAKI Motohiro <kosaki.motohiro@...>
CentOS6.3上で
3 messages
2013/03/10
[ruby-dev:47199] [ruby-trunk - Feature #8024] Lazy sweep を on/off するための機能
From:
"authorNari (Narihiro Nakamura)" <authorNari@...>
Date:
2013-03-24 17:32:37 UTC
List:
ruby-dev #47199
Issue #8024 has been updated by authorNari (Narihiro Nakamura).
ko1 (Koichi Sasada) wrote:
> (2013/03/24 12:35), authorNari (Narihiro Nakamura) wrote:
> >> > すみません、ちょっとわかってないんですが、
> >> > ObjectSpace.each_object 中って lazy GC 起きないようになってますよね。
> >> >
> >> > (1) lazy sweep を止めるときは、別スレッドで適当に
> >> > ObjectSpace.each_object を実行しておく
> >> > (で、その中で sleep させておく)、というので行けると思ったんですが、
> >> > あってますか?
> >> >
> > すみませんが、修正内容がよく理解できませんでした。
> > 別スレッドで実行すると何が解決するのでしょうか?
>
> 修正内容云々、という話ではなく、
>
> (1-1) lazy sweep を切るには、ObjectSpace.each_object
> を実行中は lazy sweep は無効になる
>
> (1-2) 例えば、
> Thread.new{ObjectSpace.each_object{sleep} # sleep で止まる
> ... 他の処理 ...
> とすると、「他の処理」実行中は lazy sweep 止まっている
>
> (1-3) 新しいメソッドなどを定義しなくても、Lazy sweep を無効にする
> ことができる
>
> という話を確認したかったのです。もしかしたら、私が何かしら勘違いしている
> かもしれないので。つまり、この ticket は簡単に実現できるんじゃないの、
> と。もちろん、実装依存の bad know-how ですが、そもそも今回の用途は実装依
> 存の挙動に対する調査なので、まぁいいかなと。
>
おおお、なるほど。おっしゃる通りだとおもいます。
> >> > (2) で、ヒープの拡張がうまくいかない問題は、ObjectSpace.each_object 中に
> >> > も同様に発生するでしょうか? もしそうなら、それはそれで修正しないといけ
> >> > ないような気がします。
> >> >
> > はい、修正が必要だと思います(のでなおしておきます)。
> > ただ、ObjectSpace.each_objectの中でヒープが拡張していくようなコードは無限ループになる可能性があるので、そもそもあまり推奨されるコードじゃないですね…。
>
> each_object の実行が止まらない可能性、ですよね。それは同意できますが、そ
> の辺を回避するのは無理なんじゃないかなぁ。
>
> で、この修正を入れないと、現状では (1) の「簡単に止められるんじゃない
> の」というのは、「実はこういう制約が入る」、ということですかね。
>
(1)の方法で簡単に止められるけど、ヒープ拡張がうまくいかない制約が入る、という意味でしょうか?
だとしたらおっしゃるとおりだと思います(もうtrunkでは修正しちゃいましたけど :P)
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37899
Author: mrkn (Kenta Murata)
Status: Closed
Priority: Normal
Assignee: authorNari (Narihiro Nakamura)
Category: core
Target version:
Lazy sweep を on/off する機能を追加するパッチを作りました。
このパッチは環境変数1つと GC のモジュール関数2つを追加します。
環境変数は RUBY_GC_DISABLE_LAZY_SWEEP です。
これに 0 以外の整数を設定して ruby を実行すると、
lazy sweep が off の状態で実行されます。
GC に追加されるモジュール関数は disable_lazy_sweep と enable_lazy_sweep です。
文字通り、lazy_sweep の on/off を切り替えるために使います。
このパッチを作るに至った経緯は、Lazy sweep が on の時だけ再現する SEGV が
弊社のテストコードで発生していたからです。
SEGV の発生条件がまだ絞れていないため、残念ながらバグ報告はまだできません。
運用上 Lazy sweep を止めておく必要があっために作ったパッチですが、
他の人の役にも立つかもしれませんので、こちらで提案させて頂きます。
trunk/2.0.0 用 → https://gist.github.com/mrkn/5096076
1.9.3 用 → https://gist.github.com/mrkn/5096071
--
http://bugs.ruby-lang.org/