thin 0.6.4 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of thin might be problematic. Click here for more details.
- data/CHANGELOG +20 -0
- data/README +11 -12
- data/benchmark/abc +51 -0
- data/benchmark/benchmarker.rb +80 -0
- data/benchmark/runner +79 -0
- data/example/adapter.rb +3 -3
- data/example/thin.god +11 -7
- data/lib/thin.rb +17 -16
- data/lib/thin/command.rb +10 -4
- data/lib/thin/connection.rb +46 -13
- data/lib/thin/connectors/connector.rb +22 -10
- data/lib/thin/connectors/swiftiply_client.rb +55 -0
- data/lib/thin/controllers/cluster.rb +28 -22
- data/lib/thin/controllers/controller.rb +74 -14
- data/lib/thin/controllers/service.rb +1 -1
- data/lib/thin/daemonizing.rb +6 -4
- data/lib/thin/headers.rb +4 -0
- data/lib/thin/logging.rb +34 -9
- data/lib/thin/request.rb +31 -2
- data/lib/thin/response.rb +22 -7
- data/lib/thin/runner.rb +27 -14
- data/lib/thin/server.rb +55 -7
- data/lib/thin/version.rb +3 -3
- data/spec/command_spec.rb +2 -3
- data/spec/connection_spec.rb +15 -1
- data/spec/connectors/swiftiply_client_spec.rb +66 -0
- data/spec/controllers/cluster_spec.rb +43 -12
- data/spec/controllers/controller_spec.rb +16 -4
- data/spec/controllers/service_spec.rb +0 -1
- data/spec/logging_spec.rb +42 -0
- data/spec/request/persistent_spec.rb +35 -0
- data/spec/response_spec.rb +18 -0
- data/spec/server/pipelining_spec.rb +108 -0
- data/spec/server/swiftiply.yml +6 -0
- data/spec/server/swiftiply_spec.rb +27 -0
- data/spec/server/tcp_spec.rb +3 -3
- data/spec/server_spec.rb +22 -0
- data/spec/spec_helper.rb +3 -3
- data/tasks/gem.rake +1 -1
- data/tasks/spec.rake +9 -0
- metadata +13 -6
- data/benchmark/previous.rb +0 -14
- data/benchmark/simple.rb +0 -15
- data/benchmark/utils.rb +0 -75
- data/lib/thin_parser.bundle +0 -0
data/benchmark/previous.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# Benchmark to compare Thin performance against
|
2
|
-
# previous Thin version (the one installed as a gem).
|
3
|
-
#
|
4
|
-
# Run with:
|
5
|
-
#
|
6
|
-
# ruby previous.rb [num of request]
|
7
|
-
#
|
8
|
-
require 'rubygems'
|
9
|
-
require 'rack'
|
10
|
-
require File.dirname(__FILE__) + '/utils'
|
11
|
-
|
12
|
-
request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
|
13
|
-
|
14
|
-
benchmark %w(current gem), request
|
data/benchmark/simple.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# Simple benchmark to compare Thin performance against
|
2
|
-
# other webservers supported by Rack.
|
3
|
-
#
|
4
|
-
# Run with:
|
5
|
-
#
|
6
|
-
# ruby simple.rb [num of request] [print|graph] [concurrency levels]
|
7
|
-
#
|
8
|
-
require File.dirname(__FILE__) + '/../lib/thin'
|
9
|
-
require File.dirname(__FILE__) + '/utils'
|
10
|
-
|
11
|
-
request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
|
12
|
-
output_type = (ARGV[1] || 'print')
|
13
|
-
levels = eval(ARGV[2] || '[1, 10, 100]').to_a
|
14
|
-
|
15
|
-
benchmark output_type, %w(WEBrick Mongrel EMongrel Thin), request, levels
|
data/benchmark/utils.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'rack/lobster'
|
2
|
-
|
3
|
-
def run(handler_name, n=1000, c=1)
|
4
|
-
port = 7000
|
5
|
-
|
6
|
-
server = fork do
|
7
|
-
[STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
|
8
|
-
|
9
|
-
case handler_name
|
10
|
-
when 'EMongrel'
|
11
|
-
require 'swiftcore/evented_mongrel'
|
12
|
-
handler_name = 'Mongrel'
|
13
|
-
|
14
|
-
when 'gem' # Load the current Thin gem
|
15
|
-
require 'thin'
|
16
|
-
handler_name = 'Thin'
|
17
|
-
|
18
|
-
when 'current' # Load the current Thin version under /lib
|
19
|
-
require File.dirname(__FILE__) + '/../lib/thin'
|
20
|
-
handler_name = 'Thin'
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
app = Rack::Lobster.new
|
25
|
-
|
26
|
-
handler = Rack::Handler.const_get(handler_name)
|
27
|
-
handler.run app, :Host => '0.0.0.0', :Port => port
|
28
|
-
end
|
29
|
-
|
30
|
-
sleep 2
|
31
|
-
|
32
|
-
out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:#{port}/ 2> /dev/null`
|
33
|
-
|
34
|
-
Process.kill('SIGKILL', server)
|
35
|
-
Process.wait
|
36
|
-
|
37
|
-
if requests = out.match(/^Requests.+?(\d+\.\d+)/)
|
38
|
-
requests[1].to_i
|
39
|
-
else
|
40
|
-
0
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def benchmark(type, servers, request, concurrency_levels)
|
45
|
-
send "#{type}_benchmark", servers, request, concurrency_levels
|
46
|
-
end
|
47
|
-
|
48
|
-
def graph_benchmark(servers, request, concurrency_levels)
|
49
|
-
require '/usr/local/lib/ruby/gems/1.8/gems/gruff-0.2.9/lib/gruff'
|
50
|
-
g = Gruff::Area.new
|
51
|
-
g.title = "Server benchmark"
|
52
|
-
|
53
|
-
servers.each do |server|
|
54
|
-
g.data(server, concurrency_levels.collect { |c| print '.'; run(server, request, c) })
|
55
|
-
end
|
56
|
-
puts
|
57
|
-
|
58
|
-
g.x_axis_label = 'Concurrency'
|
59
|
-
g.y_axis_label = 'Requests / sec'
|
60
|
-
g.labels = {}
|
61
|
-
concurrency_levels.each_with_index { |c, i| g.labels[i] = c.to_s }
|
62
|
-
|
63
|
-
g.write('bench.png')
|
64
|
-
`open bench.png`
|
65
|
-
end
|
66
|
-
|
67
|
-
def print_benchmark(servers, request, concurrency_levels)
|
68
|
-
puts 'server request concurrency req/s'
|
69
|
-
puts '=' * 42
|
70
|
-
concurrency_levels.each do |c|
|
71
|
-
servers.each do |server|
|
72
|
-
puts "#{server.ljust(8)} #{request} #{c.to_s.ljust(4)} #{run(server, request, c)}"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/lib/thin_parser.bundle
DELETED
Binary file
|