roadrunner 4.0.3 → 4.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ require 'rake/testtask'
12
12
 
13
13
  spec = Gem::Specification.new do |s|
14
14
  s.name = 'roadrunner'
15
- s.version = '4.0.3'
15
+ s.version = '4.0.4'
16
16
  s.has_rdoc = true
17
17
  s.extra_rdoc_files = ['README', 'LICENSE']
18
18
  s.summary = 'roadrunner'
data/lib/report.rb CHANGED
@@ -3,13 +3,13 @@
3
3
 
4
4
  module RoadRunnerModule
5
5
 
6
- def report(label='',width=0)
6
+ def report(opts={:label=>'',:width=>0,:msg=>""})
7
7
  p " Wait for moment,the report is collecting......"
8
8
  content = if @rep
9
9
  @succRates = getSuccessRate @transactions
10
10
  <<-DOC
11
11
  #{"Performance Reports".center(50, '*')}
12
- #{label.ljust(width)}
12
+ #{opts[:label].ljust(opts[:width])}
13
13
  #{Benchmark::Tms::CAPTION}
14
14
  #{@rep.format}
15
15
  #{'--'*32}
data/lib/roadrunner.rb CHANGED
@@ -15,14 +15,14 @@ Dir[File.join(File.dirname(__FILE__),"*.rb")].select{|x|not (x =~ /.*model\.rb/
15
15
  class RoadRunner
16
16
 
17
17
  include RoadRunnerModule
18
- attr :iterations, true
18
+ attr :iterations,true
19
19
  attr :users,true
20
20
  attr :global,true
21
21
  attr :iterationId
22
22
  attr :record
23
23
  attr :userId
24
24
  attr :mode,true
25
- attr :log
25
+ attr :log,true
26
26
  attr :tps
27
27
  alias_method :g,:global
28
28
  alias_method :g=,:global=
@@ -35,6 +35,7 @@ class RoadRunner
35
35
  @global,@transactions={},{}
36
36
  @log=Logger.new(opts[:out],opts[:frequency],opts[:size])
37
37
  @log.level=opts[:level]
38
+ @log.info("#{'-'*20} #{$0} RoadRunner log #{'-'*20}")
38
39
  # => mode : sequence<default>,thread|t,process|p
39
40
  @mode='sequence'
40
41
 
@@ -103,10 +104,10 @@ class RoadRunner
103
104
  else status = 0
104
105
  end
105
106
  # {:stats=>status,:cost=>rcost,:create_at=>Time.now} is one record
106
- @transactions[name] << {:stats=>status,:cost=>rcost,:create_at=>Time.now}
107
+ @transactions[name] << {:stats=>status,:cost=>rcost,:create_at=>Time.now.to_s}
107
108
  # => the below sentence cost a lot of system resource
108
109
  # => if you run for production result,keep it annotated!!!
109
- # self.log.debug @transactions[name].inspect
110
+ # self.log.debug "#{name} => "+@transactions[name].inspect
110
111
  rcost
111
112
  end
112
113
 
data/lib/rrmonitor.rb CHANGED
@@ -121,14 +121,14 @@ class RRMonitor
121
121
  @log.info("Monitor STOP!".center(60,"*"))
122
122
  end
123
123
 
124
- def collect
124
+ def collect(username)
125
125
  @log.debug "mkdir -p #{@path}/#{@server}"
126
126
  %x{mkdir -p #{@path}/#{@server}}
127
127
 
128
128
  path = @path.gsub('~',`echo ~`.gsub(/[\r\n]/,''))
129
129
  @log.info "Collecting...".center(60,"*")
130
130
  @log.debug "collect path => #{path}/#{@server}"
131
- `scp -r admin@#{@server}:#{@rpath} #{path}/#{@server}`
131
+ `scp -r #{username}@#{@server}:#{@rpath} #{path}/#{@server}`
132
132
  @log.info "collected files => #{Dir[path+'/'+@server+'/**/*'].join($/)}"
133
133
  end
134
134
 
@@ -162,7 +162,7 @@ class RRMonitor
162
162
 
163
163
  _servers.each do |k,v|
164
164
  v.stop!
165
- v.collect
165
+ v.collect(servers[:username])
166
166
  end
167
167
 
168
168
  end
data/lib/run.rb CHANGED
@@ -9,6 +9,24 @@ module RoadRunnerModule
9
9
  @counter = 0
10
10
 
11
11
  @log.debug "Mode => #{@mode}"
12
+
13
+ # >> Benchmark.bm {|x|x.report{(1..10).to_a.max}}
14
+ # user system total real
15
+ # 0.000000 0.000000 0.000000 ( 0.000034)
16
+ # => true
17
+ # >> Benchmark.bm {|x|x.report{(1..100).to_a.max}}
18
+ # user system total real
19
+ # 0.000000 0.000000 0.000000 ( 0.000214)
20
+ # => true
21
+ # >> Benchmark.bm {|x|x.report{(1..1000).to_a.max}}
22
+ # user system total real
23
+ # 0.000000 0.000000 0.000000 ( 0.002074)
24
+ # => true
25
+ # >> Benchmark.bm {|x|x.report{(1..1000000).to_a.max}}
26
+ # user system total real
27
+ # 1.030000 0.670000 1.700000 ( 1.766415)
28
+ # => true
29
+
12
30
  iterationBlk = case @mode
13
31
  when /thread/,/t/ then
14
32
  proc {
@@ -16,20 +34,20 @@ module RoadRunnerModule
16
34
  @thread_pool[Thread.start(){
17
35
  @iterations.times do |iterationId|
18
36
 
19
- rcost = 0
37
+ rcost = []
20
38
  @transaction_blk.each_pair{|k,v|
21
- rcost = self.transaction(k,v)
39
+ rcost << self.transaction(k,&v)
22
40
  }
23
41
 
24
42
  # rcost = self.transaction('Action',&@actBlk)
25
- self.log.debug "IterationID is #{self.iterationId};UserID is #{self.userId};This Action Cost #{rcost} seconds"
26
- @longest = (@longest<rcost)?rcost:@longest
43
+ # @log.debug "IterationID is #{self.iterationId};UserID is #{self.userId};This Action Cost #{rcost} seconds"
44
+ @longest = (@longest<rcost.max) ? rcost.max : @longest
27
45
  @thread_pool[Thread.current][:iterationId] = iterationId
28
46
  end
29
47
  @counter += 1
30
48
  }]={:userId=>userId}
31
49
  end
32
- # @thread_pool.keys.each{|t|t.join}
50
+ # @thread_pool.keys.each{|t|t.join}
33
51
  while @counter != @users do
34
52
  Thread.pass
35
53
  end
@@ -37,24 +55,52 @@ module RoadRunnerModule
37
55
  when /process/,/p/ then
38
56
  proc {
39
57
  ppid=Process.pid
40
- @log.info("Main Process pid => #{ppid}")
58
+ # @log.info("Main Process pid => #{ppid}")
41
59
 
42
60
  pids=[]
43
61
  @users.times { |userId|
44
62
  pids << Process.fork {
63
+ rcost = {}
45
64
  @userId=userId
46
65
  @iterations.times do |iterationId|
47
66
  @iterationId=iterationId
48
67
 
49
- rcost = 0
50
68
  @transaction_blk.each_pair{|k,v|
51
- rcost = self.transaction(k,v)
69
+ rcost[k]=[] unless rcost[k]
70
+ rcost[k] << self.transaction(k,&v)
71
+ # self.log.info("rcost => #{rcost.inspect}")
52
72
  }
53
73
 
54
- # rcost = self.transaction('Action',&@actBlk)
55
- @longest = (@longest<rcost)?rcost:@longest
56
74
  end
57
- @log.info("<PID:#{Process.pid}> going down.Longest job cost #{@longest}")
75
+
76
+ # >> r
77
+ # => {:y=>[2, 1, 5, 9], :x=>[1, 2, 3, 4]}
78
+ # >> r.map{|x|{x[0]=>x[1].max}}
79
+ # => [{:y=>9}, {:x=>4}]
80
+ m=0
81
+ rcost.map{|x|{x[0]=>x[1].max}}.each{|h|
82
+ if(h.values[0]>m)
83
+ @longest=h
84
+ end
85
+ }
86
+
87
+ succRates = getSuccessRate @transactions
88
+
89
+ preport=
90
+ <<-DOC
91
+ <PID:#{Process.pid}> <UserId:#{@userId}>
92
+ #{'Process Transaction Report'.center(50, '-')}
93
+ #{@transactions.inject("") { |str,k|
94
+ str += "#{k[0].to_s} : count => #{k[1].size} time(s) , cost => #{k[1].inject(0){|c,v|c+=v[:cost].to_f}.to_s[0..3]} sec(s) , success rate => #{succRates[k[0]]}#{$/}"
95
+ }.gsub(/\n$/,'')}
96
+ #{'--'*32}
97
+ DOC
98
+ self.log.info(preport)
99
+ puts(preport)
100
+
101
+ # @log.info @longest.inspect
102
+ @log.info("<PID:#{Process.pid}> going down.Longest job(#{@longest.keys[0]}) cost #{@longest.values[0]}")
103
+ p ("<PID:#{Process.pid}> going down.Longest job(#{@longest.keys[0]}) cost #{@longest.values[0]}")
58
104
 
59
105
  Process.kill("HUP", ppid)
60
106
  }
@@ -83,9 +129,9 @@ module RoadRunnerModule
83
129
  @users.times do |userId|
84
130
  @userId=userId
85
131
 
86
- rcost = 0
132
+ rcost = []
87
133
  @transaction_blk.each_pair{|k,v|
88
- rcost = self.transaction(k,v)
134
+ rcost << self.transaction(k,&v)
89
135
  }
90
136
 
91
137
  # rcost = self.transaction('Action',&@actBlk)
@@ -93,7 +139,7 @@ module RoadRunnerModule
93
139
  # => the below sentence cost a lot of system resource
94
140
  # => if you run for production result,keep it annotated!!!
95
141
  # self.log.debug "IterationID is #{self.iterationId};UserID is #{self.userId};This Action Cost #{rcost} seconds"
96
- @longest = (@longest<rcost)?rcost:@longest
142
+ @longest = (@longest<rcost.max) ? rcost.max : @longest
97
143
  end
98
144
  end
99
145
  }
data/log/stdout.log CHANGED
@@ -1,4 +1,151 @@
1
- # Logfile created on Thu Apr 22 17:32:25 +0800 2010 by logger.rb/22285
2
- D, [2010-04-22T17:32:25.408228 #25471] DEBUG -- : Mode => p
3
- I, [2010-04-22T17:32:25.426651 #25471] INFO -- : Main Process pid => 25471
4
- I, [2010-04-22T17:32:25.570585 #25471] INFO -- : Waiting Processes => [25472, 25473, 25474, 25475, 25476, 25477, 25478, 25479, 25480, 25481]
1
+ I, [2010-04-25T15:38:35.374857 #30702] INFO -- : -------------------- /Users/Cui/NetBeansProjects/roadrunner/roadrunner/test/prime_p.rb RoadRunner log --------------------
2
+ D, [2010-04-25T15:38:35.375095 #30702] DEBUG -- : Mode => p
3
+ I, [2010-04-25T15:38:35.408220 #30702] INFO -- : Waiting Processes => [30703, 30704, 30705, 30706, 30707]
4
+ I, [2010-04-25T15:38:35.753897 #30704] INFO -- : <PID:30704> <UserId:1>
5
+ ----------------Transaction Report----------------
6
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
7
+ actoin : count => 50 time(s) , cost => 0.35 sec(s) , success rate => 1.0
8
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
9
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
10
+ ----------------------------------------------------------------
11
+
12
+ I, [2010-04-25T15:38:35.754286 #30704] INFO -- : {"actoin"=>0.0302779674530029}
13
+ I, [2010-04-25T15:38:35.754386 #30704] INFO -- : <PID:30704> going down.Longest job(actoin) cost 0.0302779674530029
14
+ I, [2010-04-25T15:38:35.771185 #30702] INFO -- : One User(Process) done.
15
+ I, [2010-04-25T15:38:35.749561 #30703] INFO -- : <PID:30703> <UserId:0>
16
+ ----------------Transaction Report----------------
17
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
18
+ actoin : count => 50 time(s) , cost => 0.35 sec(s) , success rate => 1.0
19
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
20
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
21
+ ----------------------------------------------------------------
22
+
23
+ I, [2010-04-25T15:38:35.778149 #30703] INFO -- : {"actoin"=>0.0359859466552734}
24
+ I, [2010-04-25T15:38:35.778264 #30703] INFO -- : <PID:30703> going down.Longest job(actoin) cost 0.0359859466552734
25
+ I, [2010-04-25T15:38:35.780912 #30702] INFO -- : One User(Process) done.
26
+ I, [2010-04-25T15:38:35.851359 #30706] INFO -- : <PID:30706> <UserId:3>
27
+ ----------------Transaction Report----------------
28
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
29
+ actoin : count => 50 time(s) , cost => 0.41 sec(s) , success rate => 1.0
30
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
31
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
32
+ ----------------------------------------------------------------
33
+
34
+ I, [2010-04-25T15:38:35.851809 #30706] INFO -- : {"actoin"=>0.0388009548187256}
35
+ I, [2010-04-25T15:38:35.851909 #30706] INFO -- : <PID:30706> going down.Longest job(actoin) cost 0.0388009548187256
36
+ I, [2010-04-25T15:38:35.852186 #30702] INFO -- : One User(Process) done.
37
+ I, [2010-04-25T15:38:35.861282 #30705] INFO -- : <PID:30705> <UserId:2>
38
+ ----------------Transaction Report----------------
39
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
40
+ actoin : count => 50 time(s) , cost => 0.40 sec(s) , success rate => 1.0
41
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
42
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
43
+ ----------------------------------------------------------------
44
+
45
+ I, [2010-04-25T15:38:35.861756 #30705] INFO -- : {"actoin"=>0.0417690277099609}
46
+ I, [2010-04-25T15:38:35.861864 #30705] INFO -- : <PID:30705> going down.Longest job(actoin) cost 0.0417690277099609
47
+ I, [2010-04-25T15:38:35.863333 #30702] INFO -- : One User(Process) done.
48
+ I, [2010-04-25T15:38:35.866110 #30707] INFO -- : <PID:30707> <UserId:4>
49
+ ----------------Transaction Report----------------
50
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
51
+ actoin : count => 50 time(s) , cost => 0.42 sec(s) , success rate => 1.0
52
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
53
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
54
+ ----------------------------------------------------------------
55
+
56
+ I, [2010-04-25T15:38:35.866563 #30707] INFO -- : {"actoin"=>0.0417959690093994}
57
+ I, [2010-04-25T15:38:35.866670 #30707] INFO -- : <PID:30707> going down.Longest job(actoin) cost 0.0417959690093994
58
+ I, [2010-04-25T15:38:35.867903 #30702] INFO -- : One User(Process) done.
59
+ I, [2010-04-25T15:38:40.409172 #30702] INFO -- : Processes down.
60
+ I, [2010-04-25T15:38:40.412344 #30702] INFO -- : ***************Performance Reports****************
61
+
62
+ user system total real
63
+
64
+ 0.000000 0.000000 0.870000 ( 5.034264)
65
+
66
+ ----------------------------------------------------------------
67
+ The Virtual User is 5.
68
+ Total Execute 250 Action(s).
69
+ Total Cost 5.034264087677 Second(s).
70
+ This Scenario's TPS : 49.6596911973602.
71
+ The longest action cost 0 seconds.
72
+ ----------------Transaction Report----------------
73
+
74
+ ----------------------------------------------------------------
75
+ User defined params as below:
76
+ size100
77
+ ******************End of Reports******************
78
+
79
+ I, [2010-04-25T22:13:07.777877 #30988] INFO -- : -------------------- /Users/Cui/NetBeansProjects/roadrunner/roadrunner/test/prime_p.rb RoadRunner log --------------------
80
+ D, [2010-04-25T22:13:07.794956 #30988] DEBUG -- : Mode => p
81
+ I, [2010-04-25T22:13:07.842745 #30988] INFO -- : Waiting Processes => [30989, 30990, 30991, 30992, 30993]
82
+ I, [2010-04-25T22:13:08.224372 #30990] INFO -- : <PID:30990> <UserId:1>
83
+ ----------------Transaction Report----------------
84
+ a : count => 50 time(s) , cost => 0.01 sec(s) , success rate => 1.0
85
+ actoin : count => 50 time(s) , cost => 0.40 sec(s) , success rate => 1.0
86
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
87
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
88
+ ----------------------------------------------------------------
89
+
90
+ I, [2010-04-25T22:13:08.225105 #30990] INFO -- : <PID:30990> going down.Longest job(b) cost 0.000171899795532227
91
+ I, [2010-04-25T22:13:08.228904 #30988] INFO -- : One User(Process) done.
92
+ I, [2010-04-25T22:13:08.236709 #30991] INFO -- : <PID:30991> <UserId:2>
93
+ ----------------Transaction Report----------------
94
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
95
+ actoin : count => 50 time(s) , cost => 0.39 sec(s) , success rate => 1.0
96
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
97
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
98
+ ----------------------------------------------------------------
99
+
100
+ I, [2010-04-25T22:13:08.237150 #30991] INFO -- : <PID:30991> going down.Longest job(b) cost 0.000528097152709961
101
+ I, [2010-04-25T22:13:08.237970 #30988] INFO -- : One User(Process) done.
102
+ I, [2010-04-25T22:13:08.255347 #30989] INFO -- : <PID:30989> <UserId:0>
103
+ ----------------Transaction Report----------------
104
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
105
+ actoin : count => 50 time(s) , cost => 0.40 sec(s) , success rate => 1.0
106
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
107
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
108
+ ----------------------------------------------------------------
109
+
110
+ I, [2010-04-25T22:13:08.256252 #30989] INFO -- : <PID:30989> going down.Longest job(b) cost 3.19480895996094e-05
111
+ I, [2010-04-25T22:13:08.256544 #30988] INFO -- : One User(Process) done.
112
+ I, [2010-04-25T22:13:08.288183 #30993] INFO -- : <PID:30993> <UserId:4>
113
+ ----------------Transaction Report----------------
114
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
115
+ actoin : count => 50 time(s) , cost => 0.42 sec(s) , success rate => 1.0
116
+ init : count => 50 time(s) , cost => 0.01 sec(s) , success rate => 1.0
117
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
118
+ ----------------------------------------------------------------
119
+
120
+ I, [2010-04-25T22:13:08.288617 #30993] INFO -- : <PID:30993> going down.Longest job(b) cost 2.88486480712891e-05
121
+ I, [2010-04-25T22:13:08.289573 #30988] INFO -- : One User(Process) done.
122
+ I, [2010-04-25T22:13:08.323381 #30992] INFO -- : <PID:30992> <UserId:3>
123
+ ----------------Transaction Report----------------
124
+ a : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
125
+ actoin : count => 50 time(s) , cost => 0.46 sec(s) , success rate => 1.0
126
+ init : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
127
+ b : count => 50 time(s) , cost => 0.00 sec(s) , success rate => 1.0
128
+ ----------------------------------------------------------------
129
+
130
+ I, [2010-04-25T22:13:08.323846 #30992] INFO -- : <PID:30992> going down.Longest job(b) cost 0.000580072402954102
131
+ I, [2010-04-25T22:13:08.324217 #30988] INFO -- : One User(Process) done.
132
+ I, [2010-04-25T22:13:12.844448 #30988] INFO -- : Processes down.
133
+ I, [2010-04-25T22:13:12.848688 #30988] INFO -- : ***************Performance Reports****************
134
+
135
+ user system total real
136
+
137
+ 0.000000 0.000000 0.860000 ( 5.050142)
138
+
139
+ ----------------------------------------------------------------
140
+ The Virtual User is 5.
141
+ Total Execute 250 Action(s).
142
+ Total Cost 5.05014204978943 Second(s).
143
+ This Scenario's TPS : 49.5035580257439.
144
+ The longest action cost 0 seconds.
145
+ ----------------Transaction Report----------------
146
+
147
+ ----------------------------------------------------------------
148
+ User defined params as below:
149
+ size100
150
+ ******************End of Reports******************
151
+
@@ -0,0 +1,4 @@
1
+ # Logfile created on Thu Apr 22 17:32:25 +0800 2010 by logger.rb/22285
2
+ D, [2010-04-22T17:32:25.408228 #25471] DEBUG -- : Mode => p
3
+ I, [2010-04-22T17:32:25.426651 #25471] INFO -- : Main Process pid => 25471
4
+ I, [2010-04-22T17:32:25.570585 #25471] INFO -- : Waiting Processes => [25472, 25473, 25474, 25475, 25476, 25477, 25478, 25479, 25480, 25481]
data/test/pi.rb CHANGED
@@ -26,6 +26,8 @@ rrpi.action do
26
26
  1.upto(rrpi.global[:deep]){|x|rrpi.global[:pi]+=((-1)**(x+1)*1.0/(x*2-1))}
27
27
  end
28
28
 
29
+ rrpi.else{(1..rand(10000)).max}
30
+
29
31
  rrpi.ended do
30
32
  rrpi.global[:pi]*=4
31
33
  #rrpi.global={}
@@ -35,3 +37,35 @@ rrpi.run
35
37
  rrpi.report
36
38
 
37
39
  p "Tps could get : RoadRunner::tps => #{rrpi.tps}"
40
+
41
+ __END__
42
+
43
+ " ********************RoadRunner********************"
44
+ " * ---Run , on your way.*"
45
+ " **************************************************"
46
+ " Running......"
47
+ " Ending......"
48
+ " Wait for moment,the report is collecting......"
49
+ ***************Performance Reports****************
50
+
51
+ user system total real
52
+
53
+ 31.640000 17.210000 48.850000 ( 49.354817)
54
+
55
+ ----------------------------------------------------------------
56
+ The Virtual User is 10.
57
+ Total Execute 10000 Action(s).
58
+ Total Cost 49.3548169136047 Second(s).
59
+ This Scenario's TPS : 202.614468563523.
60
+ The longest action cost 0.0503699779510498 seconds.
61
+ ----------------Transaction Report----------------
62
+ else : count => 10000 time(s) , cost => 43.1 sec(s) , success rate => 1.0
63
+ end : count => 10000 time(s) , cost => 0.03 sec(s) , success rate => 1.0
64
+ actoin : count => 10000 time(s) , cost => 5.12 sec(s) , success rate => 1.0
65
+ init : count => 10000 time(s) , cost => 0.07 sec(s) , success rate => 1.0
66
+
67
+ ----------------------------------------------------------------
68
+ User defined params as below:
69
+ pi0deep100
70
+ ******************End of Reports******************
71
+ "Tps could get : RoadRunner::tps => 202.614468563523"
data/test/prime_p.rb CHANGED
@@ -14,23 +14,22 @@ rrprime.init do
14
14
  # rrprime.global是一个存储全局变量的方法
15
15
  # 任何数据类型都可以丢进去
16
16
  # 在执行report方法时,rrprime.global中的数据会被打印到报告中
17
- rrprime.global[:size]=1000
17
+ rrprime.global[:size]=100
18
18
 
19
19
  # users决定同时有多少并发用户一起执行action
20
20
  # iterations决定每个用户执行多少次
21
- rrprime.users,rrprime.iterations=10,100
21
+ rrprime.users,rrprime.iterations=5,50
22
22
  end
23
23
 
24
24
  rrprime.action do
25
-
25
+ # print "Action "+rrprime.userId.to_s+" "+Time.now.to_s+$/
26
26
  # 得到素数数组
27
27
  rrprime.global[:result]=(2..rrprime.global[:size]).inject([]) { |s, e| (s.map { |x| e % x }).include?(0) ? s : s << e }
28
28
  end
29
29
 
30
- rrprime.a{p Time.now}
31
- rrprime.b{p Time.now}
32
-
33
-
30
+ # rrprime.log.info
31
+ rrprime.a{"A-Tranction "+rrprime.userId.to_s+" "+Time.now.to_s+$/}
32
+ rrprime.b{"B-Tranction "+rrprime.userId.to_s+" "+Time.now.to_s+$/}
34
33
 
35
34
  rrprime.run
36
35
  rrprime.report
data/test/vbd_kv.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "rubygems"
2
2
  require File.join(File.dirname(__FILE__),'..','lib','roadrunner')
3
+ # require "roadrunner"
3
4
 
4
5
  #-----------------------------Argv prepare.--------------------------------#
5
6
 
@@ -10,8 +11,8 @@ def args(key)
10
11
  nil
11
12
  end
12
13
 
13
- unless args('nbd')
14
- p "[ruby ]#{$0} -nbd /dev/nbd[0-x][,/dev/nbd[0-x],/dev/nbd[0-x]]"
14
+ unless args('nbd') && args('size')
15
+ p "[ruby ]#{$0} -nbd /dev/nbd[0-x][,/dev/nbd[0-x],/dev/nbd[0-x]] -size 10240000"
15
16
  exit 1
16
17
  end
17
18
 
@@ -33,20 +34,23 @@ args('nbd').split(',').each do |n|
33
34
  end
34
35
  end
35
36
 
37
+ `echo '' > /root/nbd/sanbo/1.log`
38
+
36
39
  #--------------------------------VBD KV integration test---------------------------------#
37
40
 
38
41
  class ValidateError < Exception;end
39
-
42
+
40
43
  class Kv_vbd
41
44
  class << self
42
45
  def seq_read(nbd,fs)
46
+ $log.debug("Entry seq_read, ARGV => #{ARGV.inspect}")
43
47
  begin
44
48
  nbd.rewind# if nbd.eof?
45
49
 
46
50
  loop {
47
51
  tmp=rand(fs/10000)
48
52
  # $log.debug("seq_read:reading #{tmp} bytes from #{nbd}")
49
- tmp=nbd.sysread(tmp)
53
+ tmp=nbd.readpartial(tmp)
50
54
  break if nbd.eof?
51
55
  }
52
56
 
@@ -54,70 +58,138 @@ class Kv_vbd
54
58
  rescue Exception => e
55
59
  $log.error("#{nbd} read error!")
56
60
  end
57
- validate(nbd,fs)
61
+ # validate(nbd,fs)
58
62
  end
59
63
 
60
64
  def seq_write(nbd,fs)
65
+ $log.debug("Entry seq_write, ARGV => #{ARGV.inspect}")
61
66
  begin
62
67
  nbd.rewind# if nbd.eof?
63
68
 
64
- bs=100
69
+ # bs=1024*1024
70
+ bs=1024
71
+ data='x'*bs
65
72
 
66
- $log.debug("seq_read:writing #{bs} bytes into #{nbd}")
73
+ $log.debug("seq_write:writing #{bs} bytes into #{nbd} everytime.")
67
74
 
68
- fs/bs.times {
69
- nbd.syswrite('x'*bs)
75
+ (fs/bs).times {|t|
76
+ nbd.syswrite(data)
77
+ nbd.flush
78
+ # `sync` if t%10240 == 0
70
79
  }
80
+ (nbd.syswrite('x'*(fs%bs));nbd.flush) unless fs%bs == 0
71
81
 
72
- signature(nbd,fs)
82
+ $log.info("ruby io done.sync will exec.")
83
+ `sync`
84
+ # signature(nbd,fs)
73
85
 
74
86
  $log.info("seq_write done.#{fs} bytes write into #{nbd}.")
75
87
  rescue Exception => e
76
88
  $log.error("#{nbd} write error!")
77
89
  end
78
-
90
+ dirty_watcher(nbd,fs)
79
91
  end
80
92
 
81
93
  def signature(nbd,fs)
82
- nbd.seek(10, IO::SEEK_END)
94
+ $log.debug("Entry signature, ARGV => #{ARGV.inspect}")
95
+
96
+ nbd.rewind
97
+ nbd.seek(10)
83
98
  nbd.syswrite('c')
84
99
 
85
100
  nbd.seek(-10, IO::SEEK_END)
86
101
  nbd.syswrite('c')
102
+
103
+ begin
104
+ @MD5=`md5sum #{nbd.path}`.match(/(^[a-z0-9A-Z]*)[\s|\t].*$/)[1]
105
+ $log.info("#{nbd.path} md5sum => #{@MD5}")
106
+ rescue Exception => e
107
+ $log.error("md5sum exec error! "+e.to_s)
108
+ end
109
+
87
110
  end
88
111
 
89
112
  def validate(nbd,fs)
90
- nbd.seek(10, IO::SEEK_END)
91
- unless nbd.sysread(1) == 'c'
92
- raise ValidateError,"expect File.seek(10, IO::SEEK_END) => 'c',actually get #{tmp}."
93
- end
113
+ $log.debug("Entry validate, ARGV => #{ARGV.inspect}")
94
114
 
95
- nbd.seek(rand(fs))
96
- unless nbd.sysread(1) == 'x'
97
- raise ValidateError,"expect File.seek(rand(fs)) => 'x',actually get #{tmp}."
115
+ nbd.rewind
116
+ nbd.seek(10)
117
+ unless (tmp=nbd.sysread(1)) == 'c'
118
+ raise ValidateError,"expect File.seek(10, IO::SEEK_END) => 'c',actually get #{tmp}."
98
119
  end
99
120
 
100
121
  nbd.seek(-10, IO::SEEK_END)
101
- unless nbd.sysread(1) == 'c'
122
+ unless (tmp=nbd.sysread(1)) == 'c'
102
123
  raise ValidateError,"expect File.seek(-10, IO::SEEK_END) => 'c',actually get #{tmp}."
103
124
  end
125
+
126
+
127
+ raise ArgumentError,"No md5sum checked! @MD5 => #{@MD5}" unless @MD5
128
+ _m=`md5sum #{nbd.path}`.match(/(^[a-z0-9A-Z]*)[\s|\t].*$/)[1]
129
+ $log.info("Expect md5sum is #{@MD5}.")
130
+ $log.info("Actually md5sum is #{_m}")
131
+ unless @MD5 == _m
132
+ raise Exception,"md5sum check failed!"
133
+ end
134
+
135
+ $log.info("Validate Success...")
136
+ end
137
+
138
+ # size => get nbd device size used at Linux system
139
+ # return nbd size(Byte)
140
+ # nbd => "/dev/nbd9"
141
+ def size(nbd)
142
+ _s=`ps axf|grep #{nbd}|tail -n1|awk '{print $8}'`.to_i*1024**3
143
+ $log.info("Disk size => #{_s}")
144
+ end
145
+
146
+ def dirty_watcher(nbd,fs)
147
+ $log.debug("Entry dirty_watcher, ARGV => #{ARGV.inspect}")
148
+
149
+ dirty=''
150
+ # watch dirty file 10 times,ensure the queue is empty.
151
+ count=10
152
+ begin
153
+ dirty="/tmp/#{`ps axf|grep 'nbd-client .* #{nbd.path}'|tail -n1|awk '{print $8}'`.gsub($/,'')}.dirty"
154
+ loop {
155
+ if IO::read(dirty) == '0'*8
156
+ count-=1
157
+
158
+ if count == 0
159
+ $log.info("dirty file <#{dirty}> == #{IO::read(dirty)}.Watch over.")
160
+ break
161
+ end
162
+ else
163
+ count=10
164
+ end
165
+ sleep 3
166
+ }
167
+ rescue Exception => e
168
+ $log.error "can't find dirty file => #{dirty}"
169
+ $log.error "ps axf|grep 'nbd-client .* #{nbd.path}' => #{`ps axf|grep 'nbd-client .* #{nbd.path}'`}"
170
+ end
104
171
  end
105
172
 
106
173
  end
107
174
  end
108
175
 
109
176
 
177
+ #--------------------------------RoadRunner---------------------------------#
178
+
110
179
  rr=RoadRunner.new
111
180
  rr.mode,rr.users,rr.iterations='p',NBD.size,1
112
181
 
113
- ['seq_read','seq_write'].each_with_index{|s,i|
182
+ rr.log=$log
183
+
184
+ ['seq_write','signature','seq_read','validate'].each_with_index{|s,i|
114
185
  ts_proc=proc{
115
- Kv_vbd.send(s,NBD[rr.userId],File.size(NBD[rr.userId]))
186
+ # Kv_vbd.send(s,NBD[rr.userId],Kv_vbd.size(NBD[rr.userId].path))
187
+ Kv_vbd.send(s,NBD[rr.userId],args('size').to_i)
116
188
  }
117
189
  rr.send(s,&ts_proc)
118
190
  }
119
191
 
120
- NBD.close
121
-
122
192
  rr.run
123
- rr.report
193
+ rr.report
194
+
195
+ NBD.each{|x|x.close}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roadrunner
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.3
4
+ version: 4.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Cui
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-22 00:00:00 +08:00
12
+ date: 2010-04-26 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -50,6 +50,7 @@ files:
50
50
  - log/log.rb
51
51
  - log/stdout.log
52
52
  - log/stdout.log.20100421
53
+ - log/stdout.log.20100422
53
54
  - log/svn.log
54
55
  - test/baidu.rb
55
56
  - test/blog.rb