Feature #4607

benchmark/bm_vm3_thread_mutex.rb の性能改善

Added by Motohiro KOSAKI almost 3 years ago. Updated almost 3 years ago.

[ruby-dev:<unknown>]
Status:Closed
Priority:Normal
Assignee:Motohiro KOSAKI
Category:core
Target version:1.9.3

Description

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

bmvm3thread_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 しるモチベーションが強烈に削られるので改善したいと思います。

され、遅い理由ですが。rbmutexlock()のlastthreadの判定にはraceがあります。lockfunc()
に入ってGVLなしで走っている間はsleepにカウントされているので。かつlockfuncの中にはschedyield()が
あるのもよくなくてスレッド数がCPU数超えてるときはここでpreemptionが起きる確率はかなり高いです。
で、lastthreadだと判定するとビジーループをまわしつつrbcheck_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

mutex-benchmark-result.txt Magnifier (2.26 KB) Motohiro KOSAKI, 04/25/2011 12:16 AM

0001-mutex-fix-silly-last_thread-handling.patch Magnifier (3 KB) Motohiro KOSAKI, 04/25/2011 12:16 AM

History

#1 Updated by Motohiro KOSAKI almost 3 years ago

  • Status changed from Open to Closed
  • Assignee set to Motohiro KOSAKI
  • Target version set to 1.9.3

=begin
r31373

=end

#2 Updated by Yukihiro Matsumoto almost 3 years ago

=begin
まつもと ゆきひろです

In message "Re: [Ruby 1.9 - Feature #4607][Closed] benchmark/bmvm3thread_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

#3 Updated by Yukihiro Matsumoto almost 3 years ago

=begin
まつもと ゆきひろです

In message "Re: [Ruby 1.9 - Feature #4607][Closed] benchmark/bmvm3thread_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

Also available in: Atom PDF