Feature #4607
closedbenchmark/bm_vm3_thread_mutex.rb の性能改善
Description
=begin
以下のような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 ともに劣化はなさそうなので入れてしまってもいいでしょうか?
=end
Files
Updated by kosaki (Motohiro KOSAKI) over 13 years ago
- Status changed from Open to Closed
- Assignee set to kosaki (Motohiro KOSAKI)
- Target version set to 1.9.3
=begin
r31373
=end
Updated by matz (Yukihiro Matsumoto) over 13 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:43454] [Ruby 1.9 - Feature #4607][Closed] benchmark/bm_vm3_thread_mutex.rb の性能改善"
on Fri, 29 Apr 2011 10:17:26 +0900, Motohiro KOSAKI kosaki.motohiro@gmail.com writes:
|添付のようにビジーループを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 ともに劣化はなさそうなので入れてしまってもいいでしょうか?
いいんじゃないでしょうか。
=end
Updated by matz (Yukihiro Matsumoto) over 13 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:43454] [Ruby 1.9 - Feature #4607][Closed] benchmark/bm_vm3_thread_mutex.rb の性能改善"
on Fri, 29 Apr 2011 10:17:26 +0900, Motohiro KOSAKI kosaki.motohiro@gmail.com writes:
|添付のようにビジーループを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 ともに劣化はなさそうなので入れてしまってもいいでしょうか?
いいんじゃないでしょうか。
=end