[#43412] [Ruby 1.9 - Feature #4592][Open] Tempfileを直接保存したい — Takeyuki Fujioka <xibbar@...>

15 messages 2011/04/21

[#43453] ThreadGroup の強化案 — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

14 messages 2011/04/28
[#43901] ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Hidetoshi NAGAI <nagai@...> 2011/06/25

永井@知能.九工大です.少々長いメールで失礼します.

[#43920] Re: ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Urabe Shyouhei <shyouhei@...> 2011/06/26

ひっじょうに根本的な質問をするのですけれども、ThreadGroupって何に使うん

[#43978] Re: ThreadGroup#make_local_space! — Hidetoshi NAGAI <nagai@...> 2011/06/28

永井@知能.九工大です.

[ruby-dev:43432] [Ruby 1.9 - Feature #4607][Open] benchmark/bm_vm3_thread_mutex.rb の性能改善

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2011-04-24 15:16:25 UTC
List: ruby-dev #43432
Issue #4607 has been reported by Motohiro KOSAKI.

----------------------------------------
Feature #4607: benchmark/bm_vm3_thread_mutex.rb の性能改善
http://redmine.ruby-lang.org/issues/4607

Author: Motohiro KOSAKI
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 


以下のようなmutexを取り合うプログラムが1.8.x と比べると1.9.xは有為に遅いです

bm_vm3_thread_mutex.rb
---------------------------------
require 'thread'
m = Mutex.new
r = 0
max = 1000
(1..max).map{
  Thread.new{
    i=0
    while i<max
      i+=1
      m.synchronize{
        r += 1
      }
    end
  }
}.each{|e|
  e.join
}
raise r.to_s if r != max * max
---------------------------------

1.8.7       1.106 sec
1.9.3dev  109.064 sec 

遅いだけで機能的には困らないのですが、さすがに1分超えるテストがあると 
make benchmark しるモチベーションが強烈に削られるので改善したいと思います。

され、遅い理由ですが。rb_mutex_lock()のlast_threadの判定にはraceがあります。lock_func()
に入ってGVLなしで走っている間はsleepにカウントされているので。かつlock_funcの中にはsched_yield()が
あるのもよくなくてスレッド数がCPU数超えてるときはここでpreemptionが起きる確率はかなり高いです。
で、last_threadだと判定するとビジーループをまわしつつrb_check_deadlock()を呼びまくる実装になっている
ので不必要なデッドロックチェックばかり走って肝心のロック保持スレッドがなかなか動けないので遅い。と

添付のようにビジーループを100msecのタイムアウト付きcond_waitに変えるだけで、それなりに改善します。

1.8.7       1.106 sec
1.9.3dev  109.064 sec 
w/ patch   16.331 sec

make test-all, make benchmark ともに劣化はなさそうなので入れてしまってもいいでしょうか?



-- 
http://redmine.ruby-lang.org

In This Thread

Prev Next