public
Description: A very fast & simple Ruby web server
Homepage: http://code.macournoyer.com/thin/
Clone URL: git://github.com/macournoyer/thin.git
Search Repo:
Add script to benchmarks against previous Thin version (installed as a 
gem)
macournoyer (author)
Thu Jan 17 20:59:52 -0800 2008
commit  83ce82414300e52e30e3d938bcbbfb32ae78772e
tree    7bb6de67a41fba8bf7fc7a560bbd401d3ac2b73f
parent  bc601ce1a4f4e42e19b77d9574f7fdebae4b15e7
0
...
8
9
10
11
12
 
13
14
15
...
8
9
10
 
11
12
13
14
15
0
@@ -8,8 +8,8 @@
0
  
0
 == TASKS
0
  * Apply patch: http://groups.google.com/group/thin-ruby/browse_thread/thread/c2e157f0792f6054/9cd8b6af27854d38#9cd8b6af27854d38
0
- * Provide precompiled win32 binaries in Gem
0
  * Load options from a config file
0
+ * Add a --trace option to log response/request [thronedrk]
0
  * Create a Stats adapter to show server stats in the browser
0
  * Check for memory usage/leaks using dike or other:
0
    http://blog.evanweaver.com/articles/2007/05/06/leak-proof-direct-heap-instrumentation-for-bleak_house/
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0
@@ -1 +1,15 @@
0
+# Benchmark to compare Thin performance against
0
+# previous Thin version (the one installed as a gem).
0
+#
0
+# Run with:
0
+#
0
+# ruby previous.rb [num of request]
0
+#
0
+require 'rubygems'
0
+require 'rack'
0
+require File.dirname(__FILE__) + '/utils'
0
+
0
+request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
0
+
0
+benchmark %w(current gem), request
...
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
 
...
6
7
8
 
9
10
 
11
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
0
@@ -6,44 +6,9 @@
0
 # ruby simple.rb [num of request]
0
 #
0
 require File.dirname(__FILE__) + '/../lib/thin'
0
-require 'rack/lobster'
0
+require File.dirname(__FILE__) + '/utils'
0
 
0
-REQUEST = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
0
+request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
0
 
0
-def run(handler_name, c=1, n=REQUEST)
0
- server = fork do
0
- [STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
0
-
0
- app = Rack::Lobster.new
0
-
0
- if handler_name == 'EMongrel'
0
- require 'swiftcore/evented_mongrel'
0
- handler_name = 'Mongrel'
0
- end
0
- handler = Rack::Handler.const_get(handler_name)
0
- handler.run app, :Host => '0.0.0.0', :Port => 7000
0
- end
0
-
0
- sleep 2
0
-
0
- out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:7000/ 2> /dev/null`
0
-
0
- Process.kill('SIGKILL', server)
0
- Process.wait
0
-
0
- if requests = out.match(/^Requests.+?(\d+\.\d+)/)
0
- failed = out.match(/^Failed requests.+?(\d+)$/)[1]
0
- "#{requests[1].to_s.ljust(9)} #{failed}"
0
- else
0
- 'ERROR'
0
- end
0
-end
0
-
0
-puts 'server request concurrency req/s failures'
0
-puts '=' * 53
0
-[1, 10, 100].each do |c|
0
- %w(WEBrick Mongrel EMongrel Thin).each do |server|
0
- puts "#{server.ljust(8)} #{REQUEST} #{c.to_s.ljust(4)} #{run(server, c)}"
0
- end
0
-end
0
+benchmark %w(WEBrick Mongrel EMongrel Thin), request
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
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
0
@@ -1 +1,52 @@
0
+require 'rack/lobster'
0
+
0
+def run(handler_name, n=1000, c=1)
0
+ server = fork do
0
+ [STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
0
+
0
+ case handler_name
0
+ when 'EMongrel'
0
+ require 'swiftcore/evented_mongrel'
0
+ handler_name = 'Mongrel'
0
+
0
+ when 'gem' # Load the current Thin gem
0
+ require 'thin'
0
+ handler_name = 'Thin'
0
+
0
+ when 'current' # Load the current Thin version under /lib
0
+ require File.dirname(__FILE__) + '/../lib/thin'
0
+ handler_name = 'Thin'
0
+
0
+ end
0
+
0
+ app = Rack::Lobster.new
0
+
0
+ handler = Rack::Handler.const_get(handler_name)
0
+ handler.run app, :Host => '0.0.0.0', :Port => 7000
0
+ end
0
+
0
+ sleep 2
0
+
0
+ out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:7000/ 2> /dev/null`
0
+
0
+ Process.kill('SIGKILL', server)
0
+ Process.wait
0
+
0
+ if requests = out.match(/^Requests.+?(\d+\.\d+)/)
0
+ failed = out.match(/^Failed requests.+?(\d+)$/)[1]
0
+ "#{requests[1].to_s.ljust(9)} #{failed}"
0
+ else
0
+ 'ERROR'
0
+ end
0
+end
0
+
0
+def benchmark(servers, request, concurrency_levels=[1, 10, 100])
0
+ puts 'server request concurrency req/s failures'
0
+ puts '=' * 53
0
+ concurrency_levels.each do |c|
0
+ servers.each do |server|
0
+ puts "#{server.ljust(8)} #{request} #{c.to_s.ljust(4)} #{run(server, request, c)}"
0
+ end
0
+ end
0
+end

Comments

    No one has commented yet.