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 #1

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 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 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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0