1
2
3
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| |
require 'rubygems'
require 'rack'
require 'rack/lobster'
def run(handler_name, n=1000, c=1)
port = 7000
server = fork do
[STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
case handler_name
when 'EMongrel'
require 'swiftcore/evented_mongrel'
handler_name = 'Mongrel'
when 'Thin'
require 'thin'
hander_name = 'Thin'
when 'gem' # Load the current Mongrel gem
require 'mongrel'
handler_name = 'Mongrel'
when 'current' # Load the current Mongrel version under /lib
require File.dirname(__FILE__) + '/../lib/mongrel'
handler_name = 'Mongrel'
end
app = Rack::Lobster.new
handler = Rack::Handler.const_get(handler_name)
handler.run app, :Host => '0.0.0.0', :Port => port
end
sleep 2
out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:#{port}/ 2> /dev/null`
Process.kill('SIGKILL', server)
Process.wait
if requests = out.match(/^Requests.+?(\d+\.\d+)/)
requests[1].to_i
else
0
end
end
def benchmark(type, servers, request, concurrency_levels)
send "#{type}_benchmark", servers, request, concurrency_levels
end
def graph_benchmark(servers, request, concurrency_levels)
require '/usr/local/lib/ruby/gems/1.8/gems/gruff-0.2.9/lib/gruff'
g = Gruff::Area.new
g.title = "Server benchmark"
servers.each do |server|
g.data(server, concurrency_levels.collect { |c| print '.'; run(server, request, c) })
end
puts
g.x_axis_label = 'Concurrency'
g.y_axis_label = 'Requests / sec'
g.labels = {}
concurrency_levels.each_with_index { |c, i| g.labels[i] = c.to_s }
g.write('bench.png')
`open bench.png`
end
def print_benchmark(servers, request, concurrency_levels)
puts 'server request concurrency req/s'
puts '=' * 42
concurrency_levels.each do |c|
servers.each do |server|
puts "#{server.ljust(8)} #{request} #{c.to_s.ljust(4)} #{run(server, request, c)}"
end
end
end
|