Bug #5688

Solaris10 で spawn を繰り返すとメモリリークする

Added by okkez _ over 3 years ago. Updated about 3 years ago.

[ruby-dev:44904]
Status:Closed
Priority:Normal
Assignee:okkez _
ruby -v:- Backport:

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 に変えても同様でした。


Related issues

Related to Backport193 - Backport #5996: please backport r34033.(fix memory leak) Closed 02/10/2012

Associated revisions

Revision 34033
Added by okkez _ about 3 years ago

  • thread_pthread.c (rb_thread_create_timer_thread): fix memory leak. [Bug #5688]

Revision 34033
Added by okkez _ about 3 years ago

  • thread_pthread.c (rb_thread_create_timer_thread): fix memory leak. [Bug #5688]

History

#1 Updated by okkez _ over 3 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

#2 Updated by Nobuyoshi Nakada over 3 years ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to okkez _
  • Target version set to 2.0.0

たしかにpthread_attr_destroy()が抜けているように見えます。
コミットよろしく。

#3 Updated by okkez _ over 3 years ago

  • Assignee deleted (okkez _)

いや、私はコミット権持ってないのでコミットできないです。

#4 Updated by Usaku NAKAMURA over 3 years ago

  • ruby -v changed from ruby 1.9.3p0 (2011-10-30 revision 33570) [i386-solaris2.10] to -

こんにちは、なかむら(う)です。

In message " [ruby-trunk - Bug #5688] Solaris10 で spawn を繰り返すとメモリリークする"
on Dec.01,2011 21:59:37, redmine@ruby-lang.org wrote:

いや、私はコミット権持ってないのでコミットできないです。

これが勧誘の手口です。

それでは。
--
U.Nakamura usa@garbagecollect.jp

#5 Updated by okkez _ over 3 years ago

  • Assignee set to okkez _

勧誘の手口に乗ります!

http://redmine.ruby-lang.org/projects/ruby/wiki/CommitterHowtoJa
によると、まつもとさんの承認が必要らしいので、承認お願いします。 > まつもとさん

#6 Updated by Motohiro KOSAKI over 3 years ago

勧誘の手口に乗ります!

http://redmine.ruby-lang.org/projects/ruby/wiki/CommitterHowtoJa
によると、まつもとさんの承認が必要らしいので、承認お願いします。 > まつもとさん

ああ、悪辣なRubyistたちの手口に善良なデベロッパがまたひとり・・・・

#7 Updated by Shota Fukumori over 3 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 コミッターになってよ!

#8 Updated by okkez _ about 3 years ago

  • Assignee changed from okkez _ to Yukihiro Matsumoto

見落されているようなので一旦まつもとさんに担当を振ってみます。

#9 Updated by Yukihiro Matsumoto about 3 years ago

まつもと ゆきひろです

In message "Re: [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 )で申請
してください。前田くん、よろしく。

そろそろgithub化してpull requestで処理すべき?

#10 Updated by Shugo Maeda about 3 years ago

前田です。

2011年12月12日12:54 Yukihiro Matsumoto matz@ruby-lang.org:

|Assignee changed from okkez _ to Yukihiro Matsumoto
|見落されているようなので一旦まつもとさんに担当を振ってみます。

おお、見落としてました。例の手順(see )で申請
してください。前田くん、よろしく。

了解しました。

そろそろgithub化してpull requestで処理すべき?

これはRubyのリポジトリ自体の話です?

--
Shugo Maeda

#11 Updated by Yukihiro Matsumoto about 3 years ago

まつもと ゆきひろです

In message "Re: 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のリポジトリ自体の話です?

ええ。定期的に指揮者のご意見を伺いたいものです。たとえ今回も
移行できないにしても。

#12 Updated by Naohisa Goto about 3 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 になるのは別の問題だと思うので後で調べます。

#13 Updated by okkez _ about 3 years ago

  • Assignee changed from Yukihiro Matsumoto to okkez _

コミット権を頂いたので担当を変更します。

#14 Updated by okkez _ about 3 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. [Bug #5688]

Also available in: Atom PDF