OSDN Git Service

Replaced mongrel with thin
[redminele/redminele.git] / ruby / lib / ruby / gems / 1.8 / gems / thin-1.2.11-x86-mswin32 / benchmark / benchmarker.rb
1 require 'rack/lobster'
2
3 class Benchmarker
4   PORT    = 7000
5   ADDRESS = '0.0.0.0'
6   
7   attr_accessor :requests, :concurrencies, :servers, :keep_alive
8   
9   def initialize
10     @servers = %w(Mongrel EMongrel Thin)
11     @requests = 1000
12     @concurrencies = [1, 10, 100]
13   end
14   
15   def writer(&block)
16     @writer = block
17   end
18   
19   def run!
20     @concurrencies.each do |concurrency|
21       @servers.each do |server|
22         req_sec, failed = run_one(server, concurrency)
23         @writer.call(server, @requests, concurrency, req_sec, failed)
24       end
25     end
26   end
27   
28   private
29     def start_server(handler_name)
30       @server = fork do
31         [STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
32
33         case handler_name
34         when 'EMongrel'
35           require 'swiftcore/evented_mongrel'
36           handler_name = 'Mongrel'
37         end
38
39         app = proc do |env|
40           [200, {'Content-Type' => 'text/html', 'Content-Length' => '11'}, ['hello world']]
41         end
42
43         handler = Rack::Handler.const_get(handler_name)
44         handler.run app, :Host => ADDRESS, :Port => PORT
45       end
46     
47       sleep 2
48     end
49   
50     def stop_server
51       Process.kill('SIGKILL', @server)
52       Process.wait
53     end
54   
55     def run_ab(concurrency)
56       `nice -n20 ab -c #{concurrency} -n #{@requests} #{@keep_alive ? '-k' : ''} #{ADDRESS}:#{PORT}/ 2> /dev/null`
57     end
58   
59     def run_one(handler_name, concurrency)
60       start_server(handler_name)
61
62       out = run_ab(concurrency)
63
64       stop_server
65
66       req_sec = if matches = out.match(/^Requests.+?(\d+\.\d+)/)
67         matches[1].to_i
68       else
69         0
70       end
71     
72       failed = if matches = out.match(/^Failed requests.+?(\d+)/)
73         matches[1].to_i
74       else
75         0
76       end
77     
78       [req_sec, failed]
79     end
80 end