Project

General

Profile

Actions

Feature #4607

closed

benchmark/bm_vm3_thread_mutex.rb の性能改善

Added by kosaki (Motohiro KOSAKI) over 13 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
[ruby-dev:<unknown>]

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

mutex-benchmark-result.txt (2.26 KB) mutex-benchmark-result.txt kosaki (Motohiro KOSAKI), 04/25/2011 12:16 AM
0001-mutex-fix-silly-last_thread-handling.patch (3 KB) 0001-mutex-fix-silly-last_thread-handling.patch kosaki (Motohiro KOSAKI), 04/25/2011 12:16 AM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0