Bug #5688
closedSolaris10 で spawn を繰り返すとメモリリークする
Description
Solaris10 で spawn を繰り返すとメモリリークします。
Ruby は Solaris の gcc でビルドしています。32bit でも 64bit でも結果は同じでした。
1.9.2-p180(64bit), 1.9.2-p290(32bit), 1.9.3-p0(64bit) で確認しました。
再現手順は以下の通りです。
spawn-sleep.rb を以下の内容で作ります。
#!/usr/bin/env ruby
ARGV[0].to_i.times do |n|
spawn("sleep", "5")
sleep 0.2
GC.start if n % 100 == 0
end
spawn-sleep.sh を以下の内容で作ります。
#!/bin/bash
./spawn-sleep.rb 3000 &
pid=$!
echo spawn-sleep:$pid
trap "kill $pid; exit" INT TERM
count=0
while true; do
date "+%Y-%m-%d %H:%M:%S"
ps -o pid,ppid,vsz,rss,args | head -1
ps -o pid,ppid,vsz,rss,args | grep spawn-sleep.rb | grep -v grep
echo "=========="
sleep 1
done
これで spawn-sleep.sh を実行すると spawn-sleep.rb の VSZ と RSS が徐々に増えていきます。
これはメモリリークだと思うのですが、Debian(sid) では再現しませんでした。
ちなみに、spawn の部分を system に変えても同様でした。
Updated by okkez (okkez _) about 13 years ago
=begin
r33784 向けのパッチです。
Debian 上で test-all が全て通ることを確認しています。
Solaris 上では確認できていませんので、どなたか追試していただけると助かります。
diff --git a/thread_pthread.c b/thread_pthread.c
index 7fa8e95..b5c97bd 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -1236,6 +1236,7 @@ rb_thread_create_timer_thread(void)
fprintf(stderr, "[FATAL] Failed to create timer thread (errno: %d)\n", err);
exit(EXIT_FAILURE);
}
-
}pthread_attr_destroy(&attr);
}
以下のパッチで Solaris 上の 1.9.2-p180 でメモリリークが解消できました。
Solaris 上で test-all の E,F が増えていないことを確認しました。
diff --git a/thread_pthread.c b/thread_pthread.c
index 4746aaa..ab7bdf9 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -835,6 +835,7 @@ rb_thread_create_timer_thread(void)
}
native_cond_wait(&timer_thread_cond, &timer_thread_lock);
native_mutex_unlock(&timer_thread_lock);
- pthread_attr_destroy(&attr);
}
rb_disable_interrupt(); /* only timer thread recieve signal */
}
できれば、1.9.2, 1.9.3 にもバックポートして欲しいです。
よろしくお願いします。
=end
Updated by nobu (Nobuyoshi Nakada) about 13 years ago
- Category set to core
- Status changed from Open to Assigned
- Assignee set to okkez (okkez _)
- Target version set to 2.0.0
たしかにpthread_attr_destroy()が抜けているように見えます。
コミットよろしく。
Updated by okkez (okkez _) about 13 years ago
- Assignee deleted (
okkez (okkez _))
いや、私はコミット権持ってないのでコミットできないです。
Updated by usa (Usaku NAKAMURA) about 13 years ago
- ruby -v changed from ruby 1.9.3p0 (2011-10-30 revision 33570) [i386-solaris2.10] to -
こんにちは、なかむら(う)です。
In message "[ruby-dev:44916] [ruby-trunk - Bug #5688] Solaris10 で spawn を繰り返すとメモリリークする"
on Dec.01,2011 21:59:37, redmine@ruby-lang.org wrote:
いや、私はコミット権持ってないのでコミットできないです。
これが勧誘の手口です。
それでは。¶
U.Nakamura usa@garbagecollect.jp
Updated by okkez (okkez _) about 13 years ago
- Assignee set to okkez (okkez _)
勧誘の手口に乗ります!
http://redmine.ruby-lang.org/projects/ruby/wiki/CommitterHowtoJa
によると、まつもとさんの承認が必要らしいので、承認お願いします。 > まつもとさん
Updated by kosaki (Motohiro KOSAKI) about 13 years ago
勧誘の手口に乗ります!
http://redmine.ruby-lang.org/projects/ruby/wiki/CommitterHowtoJa
によると、まつもとさんの承認が必要らしいので、承認お願いします。 > まつもとさん
ああ、悪辣なRubyistたちの手口に善良なデベロッパがまたひとり・・・・
Updated by sorah (Sorah Fukumori) about 13 years ago
On 12/2/11 1:40 PM, KOSAKI Motohiro wrote:
ああ、悪辣なRubyistたちの手口に善良なデベロッパがまたひとり・・・・
Ruby コミッターこわいわー
--
Shota Fukumori a.k.a. sora_h - http://sorah.jp/
僕と契約して Ruby コミッターになってよ!
Updated by okkez (okkez _) about 13 years ago
- Assignee changed from okkez (okkez _) to matz (Yukihiro Matsumoto)
見落されているようなので一旦まつもとさんに担当を振ってみます。
Updated by matz (Yukihiro Matsumoto) about 13 years ago
まつもと ゆきひろです
In message "Re: [ruby-dev:44968] [ruby-trunk - Bug #5688] Solaris10 で spawn を繰り返すとメモリリークする"
on Mon, 12 Dec 2011 12:36:09 +0900, okkez _ redmine@ruby-lang.org writes:
|Assignee changed from okkez _ to Yukihiro Matsumoto
|見落されているようなので一旦まつもとさんに担当を振ってみます。
おお、見落としてました。例の手順(see [ruby-dev:43227])で申請
してください。前田くん、よろしく。
そろそろgithub化してpull requestで処理すべき?
Updated by shugo (Shugo Maeda) about 13 years ago
前田です。
2011年12月12日12:54 Yukihiro Matsumoto matz@ruby-lang.org:
|Assignee changed from okkez _ to Yukihiro Matsumoto
|見落されているようなので一旦まつもとさんに担当を振ってみます。おお、見落としてました。例の手順(see [ruby-dev:43227])で申請
してください。前田くん、よろしく。
了解しました。
そろそろgithub化してpull requestで処理すべき?
これはRubyのリポジトリ自体の話です?
--
Shugo Maeda
Updated by matz (Yukihiro Matsumoto) about 13 years ago
まつもと ゆきひろです
In message "Re: [ruby-dev:44971] Re: [ruby-trunk - Bug #5688] Solaris10 で spawn を繰り返すとメモリリークする"
on Mon, 12 Dec 2011 13:16:08 +0900, Shugo Maeda shugo@ruby-lang.org writes:
|> そろそろgithub化してpull requestで処理すべき?
|
|これはRubyのリポジトリ自体の話です?
ええ。定期的に指揮者のご意見を伺いたいものです。たとえ今回も
移行できないにしても。
Updated by ngoto (Naohisa Goto) about 13 years ago
後藤です。sparc上のSolaris担当ということになってますが、Intelチップ上のSolarisはよく知りません。
r34010 + trunk用のパッチが、sparc 上の Solaris10 にて、SunStudio 11, gcc 4.4.3, gcc 3.4.3, fcc 5.6 の32ビット、64ビット両方のコンパイルオプションにて、make testが通り、Error/Failureが増えていないことを確認しました。
Oracle SolarisStudio 12.2 で 64ビットコンパイルすると make test-all が Segmentation Fault になるのは別の問題だと思うので後で調べます。
Updated by okkez (okkez _) about 13 years ago
- Assignee changed from matz (Yukihiro Matsumoto) to okkez (okkez _)
コミット権を頂いたので担当を変更します。
Updated by okkez (okkez _) about 13 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r34033.
okkez, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- thread_pthread.c (rb_thread_create_timer_thread): fix memory
leak. [ruby-dev:44904] [Bug #5688]