Forum: Ruby-dev [ruby-trunk - Feature #8024][Assigned] Lazy sweep を on/off するための機能

Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-06 02:50
(Received via mailing list)
Issue #8024 has been reported by mrkn (Kenta Murata).

----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by kosaki (Motohiro KOSAKI) (Guest)
on 2013-03-06 03:09
(Received via mailing list)
Issue #8024 has been updated by kosaki (Motohiro KOSAKI).


えーと、一般論としてチューニングパラメータはdisable_hogehoge とかいう否定形は好ましくないよ。間違えるから。
環境変数は RUBY_GC_ENABLE_LAZY_SWEEP のほうがよいんじゃないかな。
GC.disable_lazy_sweepも有り難みがよくわかりませんでした。


----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37322

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-06 12:24
(Received via mailing list)
Issue #8024 has been updated by mrkn (Kenta Murata).


> GC.disable_lazy_sweepも有り難みがよくわかりませんでした。

rspec が spec ファイル群をロードするだけで10分以上かかる場合があるので、
プロセスの起動時〜specファイルロード完了までは lazy sweep は有効であって欲しくて、
begin(:suite) で GC.disable_lazy_sweep することにしています。

ですから、私の個人的なユースケースでは GC.enable_lazy_sweep は使っていません。
GC.disable / GC.enable のペアとの対称性を保つために追加してあるだけだったりします。

環境変数は起動直後からオフにしたいときに使うようにしています。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37328

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by kosaki (Motohiro KOSAKI) (Guest)
on 2013-03-06 16:55
(Received via mailing list)
Issue #8024 has been updated by kosaki (Motohiro KOSAKI).


今後なにかあるたびに、GCにメソッドが2つづつ増えるのは非生産的なので、対称性だけが目的なら 
GC.enableにbool引数追加して、GC.enable_lazy_sweepもそうするってのが私の好みかなあ。すでにstressはboolean値のようだし。
ただの好みなのでむらけんさんの好みに合わないならこれ以上はプッシュしません

では。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37332

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by sorah (Shota Fukumori) (Guest)
on 2013-03-06 20:53
(Received via mailing list)
Issue #8024 has been updated by sorah (Shota Fukumori).


bool 値化同意します。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37334

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-07 02:43
(Received via mailing list)
Issue #8024 has been updated by mrkn (Kenta Murata).


> むらけんさんの好みに合わないなら

この件に関しては好みを主張できるほど詳しくないので、メソッド名から要/不要まで nari3 にすべての決めて頂こうと考えてました。
私は真偽値を与えて on/off を制御する方式でも問題ないと思ってます〜

----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37343

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-07 03:15
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).


このメソッドや環境変数を追加する動機が「SEGVが発生するかしないかの切り分けのため」なので、その用途だけでメソッド追加などをするのはやり過ぎかな、と思いました。
SEGVが直ったら用済みになっちゃうかもしれないですよね…。

それ以外の用途がなにかあれば教えてもらえると助かります。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37345

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by mrkn (Kenta Murata) (Guest)
on 2013-03-07 04:28
(Received via mailing list)
Issue #8024 has been updated by mrkn (Kenta Murata).


> SEGVが発生するかしないかの切り分けのため

これは正確な表現ではなく、本当の動機は「SEGVを回避するため」です。

> SEGVが直ったら用済みになっちゃうかもしれないですよね…。

そうですね。

> それ以外の用途

ありません〜
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37346

Author: mrkn (Kenta Murata)
Status: Assigned
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
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-19 03:28
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).

Status changed from Assigned to Rejected

特にみなさんから反論もなさそうなのでRejectしておきます。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37713

Author: mrkn (Kenta Murata)
Status: Rejected
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
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-23 16:01
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).


ちなみに以下のようにパッチを修正しないとヒープがうまく拡張してくれず、GCが多発するようです > mrknさん
https://gist.github.com/authorNari/5227985/revisions
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37857

Author: mrkn (Kenta Murata)
Status: Rejected
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
Posted by naruse (Yui NARUSE) (Guest)
on 2013-03-23 16:12
(Received via mailing list)
Issue #8024 has been updated by naruse (Yui NARUSE).


authorNari (Narihiro Nakamura) wrote:
> ちなみに以下のようにパッチを修正しないとヒープがうまく拡張してくれず、GCが多発するようです > mrknさん
> https://gist.github.com/authorNari/5227985/revisions

わたしも先日 lazy sweep 切ってデバッグしたくなったので、マクロ定義を見るとかでもいいので、
正しい lazy sweep を切るコード自体は入れておいて頂けませんか。

参考 
https://github.com/nurse/rubyspec/commit/c02c78b38...
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37858

Author: mrkn (Kenta Murata)
Status: Rejected
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
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-23 16:16
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).

Status changed from Rejected to Open

なるほどです。デバッグ用途にマクロでONになるやつを作ってみます。
----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37859

Author: mrkn (Kenta Murata)
Status: Open
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
Posted by SASADA Koichi (Guest)
on 2013-03-23 16:29
(Received via mailing list)
すみません、ちょっとわかってないんですが、
ObjectSpace.each_object 中って lazy GC 起きないようになってますよね。

(1) lazy sweep を止めるときは、別スレッドで適当に
ObjectSpace.each_object を実行しておく
(で、その中で sleep させておく)、というので行けると思ったんですが、
あってますか?

(2) で、ヒープの拡張がうまくいかない問題は、ObjectSpace.each_object 中に
も同様に発生するでしょうか? もしそうなら、それはそれで修正しないといけ
ないような気がします。
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-24 04:35
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).


ko1 (Koichi Sasada) wrote:
> すみません、ちょっとわかってないんですが、
>  ObjectSpace.each_object 中って lazy GC 起きないようになってますよね。
>
>  (1) lazy sweep を止めるときは、別スレッドで適当に
>  ObjectSpace.each_object を実行しておく
>  (で、その中で sleep させておく)、というので行けると思ったんですが、
>  あってますか?
>

すみませんが、修正内容がよく理解できませんでした。
別スレッドで実行すると何が解決するのでしょうか?

>  (2) で、ヒープの拡張がうまくいかない問題は、ObjectSpace.each_object 中に
>  も同様に発生するでしょうか? もしそうなら、それはそれで修正しないといけ
>  ないような気がします。
>

はい、修正が必要だと思います(のでなおしておきます)。
ただ、ObjectSpace.each_objectの中でヒープが拡張していくようなコードは無限ループになる可能性があるので、そもそもあまり推奨されるコードじゃないですね…。

----------------------------------------
Feature #8024: Lazy sweep を on/off するための機能
https://bugs.ruby-lang.org/issues/8024#change-37873

Author: mrkn (Kenta Murata)
Status: Open
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
Posted by SASADA Koichi (Guest)
on 2013-03-24 16:21
(Received via mailing list)
(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) の「簡単に止められるんじゃない
の」というのは、「実はこういう制約が入る」、ということですかね。
Posted by authorNari (Narihiro Nakamura) (Guest)
on 2013-03-24 18:33
(Received via mailing list)
Issue #8024 has been updated by authorNari (Narihiro Nakamura).


ko1 (Koichi Sasada) wrote:
>  > 別スレッドで実行すると何が解決するのでしょうか?
>
>  (1-3) 新しいメソッドなどを定義しなくても、Lazy sweep を無効にする
>        ことができる
>
>  という話を確認したかったのです。もしかしたら、私が何かしら勘違いしている
>  かもしれないので。つまり、この ticket は簡単に実現できるんじゃないの、
>  と。もちろん、実装依存の bad know-how ですが、そもそも今回の用途は実装依
>  存の挙動に対する調査なので、まぁいいかなと。
>

おおお、なるほど。おっしゃる通りだとおもいます。

>  で、この修正を入れないと、現状では (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
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.