ry / ebb fork watch download tarball
public
Description: web server
Homepage: http://ebb.rubyforge.org
Clone URL: git://github.com/ry/ebb.git
Search Repo:
Clean up benchmark scripts
Ryan Dahl (author)
Wed Mar 12 10:44:11 -0700 2008
commit  bfcf5b16915ba08d599b6248613d6e9a5e0f0cc9
tree    19378f66d7bee27652ff110a821ebead97a4b2f0
parent  023a85c3083bea17375f24c751af8fd97214b8ba
0
...
93
94
95
96
97
 
98
99
100
 
101
102
103
104
105
106
107
...
93
94
95
 
 
96
97
98
 
99
100
101
102
 
103
104
105
0
@@ -93,15 +93,13 @@
0
 ## Contributions
0
 
0
 Contributions (patches, criticism, advice) are very welcome! The source code
0
-is hosted at [repo.or.cz](http://repo.or.cz/w/ebb.git) (and also mirrored at
0
-[github](http://github.com/ry/ebb/tree/master)). It can be retrieved by
0
+is hosted [github](http://github.com/ry/ebb/tree/master). It can be retrieved by
0
 executing
0
 
0
-`git clone http://repo.or.cz/r/ebb.git`
0
+`git clone git@github.com:ry/ebb.git`
0
 
0
 I intend to keep the C code base very small, so do email me before writing any
0
 large additions. Here are some features that I would like to add:
0
-* Streaming responses!
0
 * HTTP 1.1 Expect/Continue (RFC 2616, sections 8.2.3 and 10.1.1)
0
 * A parser for multipart/form-data
0
 * Optimize and clean up upload handling
...
4
5
6
7
8
 
 
9
10
11
 
 
 
12
13
14
15
16
17
18
19
 
 
 
20
21
22
23
 
 
 
 
 
 
 
 
 
 
24
25
26
27
28
29
 
 
30
31
 
 
 
 
 
 
32
33
34
35
36
...
36
37
38
 
 
39
40
41
 
42
43
 
44
45
...
4
5
6
 
 
7
8
9
 
 
10
11
12
13
14
15
16
17
 
 
 
18
19
20
21
 
 
 
22
23
24
25
26
27
28
29
30
31
32
 
 
 
 
 
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
...
47
48
49
50
51
52
53
 
54
55
 
56
57
58
0
@@ -4,31 +4,42 @@
0
 require 'server_test'
0
 
0
 class Array
0
- def avg
0
- sum.to_f / length
0
+ def max
0
+ inject(first) { |m, i| i > m ? i : m }
0
   end
0
- def sum
0
- inject(0) { |i, s| s += i }
0
+
0
+ def min
0
+ inject(first) { |m, i| i < m ? i : m }
0
   end
0
 end
0
 
0
 
0
 
0
-colors = %w{F74343 444130 7DA478 E4AC3D}
0
-max_x = 0
0
-max_y = 0
0
+colors = %w{F74343 444130 7DA478 E4AC3D 1F479E}
0
+data_x = []
0
+data_y = []
0
 results = ServerTestResults.open(ARGV[0])
0
-all_m = []
0
-response_chart = GoogleChart::LineChart.new('400x300', Time.now.strftime('%Y.%m.%d'), true)
0
-results.servers.each do |server|
0
+
0
+response_chart = GoogleChart::LineChart.new('500x300', Time.now.strftime('%Y.%m.%d'), true)
0
+servers = results.servers.sort_by do |x,y|
0
+ results.data(x).map { |d| d[1] }.mean
0
+end.reverse
0
+
0
+cmap = {}
0
+results.servers.sort.each { |x| cmap[x] = colors.shift }
0
+
0
+servers.each do |server|
0
   data = results.data(server).sort
0
- response_chart.data(server, data, colors.shift)
0
- x = data.map { |d| d[0] }.max
0
- y = data.map { |d| d[1] }.max
0
- max_x = x if x > max_x
0
- max_y = y if y > max_y
0
+ data_x += data.map { |d| d[0] }
0
+ data_y += data.map { |d| d[1] }
0
 end
0
 
0
+servers.each do |server|
0
+ data = results.data(server).sort
0
+ data.map! { |d| [d[0]-data_x.min, d[1]-data_y.min]}
0
+ response_chart.data(server, data, cmap[server])
0
+end
0
+
0
 label = case results.benchmark
0
 when "response_size"
0
   "kilobytes served"
0
0
0
@@ -36,11 +47,13 @@
0
   "concurrency"
0
 when "post_size"
0
   "kilobytes uploaded"
0
+when "wait", "wait_fib"
0
+ "seconds waited every 10 requests"
0
 end
0
 
0
-response_chart.axis(:y, :range => [0,max_y])
0
+response_chart.axis(:y, :range => [data_y.min,data_y.max])
0
 response_chart.axis(:y, :labels => ['req/s'], :positions => [50])
0
-response_chart.axis(:x, :range => [0,max_x])
0
+response_chart.axis(:x, :range => [data_x.min,data_x.max])
0
 response_chart.axis(:x, :labels => [label], :positions => [50])
0
 puts response_chart.to_url
...
6
7
8
9
10
 
 
11
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
14
 
15
16
17
...
27
28
29
30
 
31
32
33
...
61
62
63
64
 
65
66
67
...
164
165
166
 
167
168
169
...
6
7
8
 
 
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
37
38
39
40
...
50
51
52
 
53
54
55
56
...
84
85
86
 
87
88
89
90
...
187
188
189
190
191
192
193
0
@@ -6,12 +6,35 @@
0
 
0
 
0
 class Array
0
- def avg
0
- sum.to_f / length
0
+ def mean
0
+ @mean ||= sum / length
0
   end
0
   
0
+ def variance
0
+ @variance ||= map { |x| (mean - x)**2 }.sum / length
0
+ end
0
+
0
+ def stdd
0
+ @stdd ||= Math.sqrt(variance)
0
+ end
0
+
0
+ def errors
0
+ map { |x| (mean - x).abs }
0
+ end
0
+
0
+ def center_avg
0
+ return mean if stdd < 10
0
+ acceptable_error = 0
0
+ good_points = []
0
+ while good_points.empty?
0
+ acceptable_error += stdd
0
+ good_points = select { |x| (mean - x).abs < acceptable_error }
0
+ end
0
+ good_points.mean
0
+ end
0
+
0
   def sum
0
- inject(0) { |i, s| s += i }
0
+ inject(0.to_f) { |i, s| s += i }
0
   end
0
   
0
   def rand_each(&block)
0
@@ -27,7 +50,7 @@
0
       new
0
     end
0
   end
0
-
0
+ attr_reader :results
0
   def initialize(results = [])
0
     @results = results
0
   end
0
@@ -61,7 +84,7 @@
0
     datas = []
0
     ticks.each do |c|
0
       measurements = server_data.find_all { |d| d[:input] == c }.map { |d| d[:rps] }
0
- datas << [c, measurements.avg]
0
+ datas << [c, measurements.mean] unless measurements.empty?
0
     end
0
     datas
0
   end
0
@@ -164,6 +187,7 @@
0
       :server => @name,
0
       :rps => rps,
0
       :requests_completed => requests_completed,
0
+ :requests_failed => failed_requests,
0
       :ab_cmd => cmd
0
     }
0
   end
...
51
52
53
54
55
56
57
...
51
52
53
 
54
55
56
0
@@ -51,7 +51,6 @@
0
       'rack.version' => [0, 1],
0
       'rack.errors' => STDERR,
0
       'rack.url_scheme' => 'http',
0
- 'rack.multithread' => true,
0
       'rack.multiprocess' => false,
0
       'rack.run_once' => false
0
     }

Comments

    No one has commented yet.