about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
authorevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2008-02-20 05:49:44 +0000
committerevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2008-02-20 05:49:44 +0000
commit03f1d87de53de35d78a5ee5ae1c40b65586f2912 (patch)
treeeaa09a782c8d76f7a250a2ce017e5ca6767d8dae /test
parent34983d6fd6e5b0f7c31d05e1b379162d68a3f5a8 (diff)
downloadunicorn-03f1d87de53de35d78a5ee5ae1c40b65586f2912.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/branches/stable_1-1@971 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'test')
-rw-r--r--test/benchmark/previous.rb11
-rw-r--r--test/benchmark/simple.rb11
-rw-r--r--test/benchmark/utils.rb82
3 files changed, 104 insertions, 0 deletions
diff --git a/test/benchmark/previous.rb b/test/benchmark/previous.rb
new file mode 100644
index 0000000..8b6182a
--- /dev/null
+++ b/test/benchmark/previous.rb
@@ -0,0 +1,11 @@
+# Benchmark to compare Mongrel performance against
+# previous Mongrel version (the one installed as a gem).
+#
+# Run with:
+#
+#  ruby previous.rb [num of request]
+#
+
+require File.dirname(__FILE__) + '/utils'
+
+benchmark "print", %w(current gem), 1000, [1, 10, 100]
diff --git a/test/benchmark/simple.rb b/test/benchmark/simple.rb
new file mode 100644
index 0000000..906f74c
--- /dev/null
+++ b/test/benchmark/simple.rb
@@ -0,0 +1,11 @@
+#
+# Simple benchmark to compare Mongrel performance against
+# other webservers supported by Rack.
+#
+
+require File.dirname(__FILE__) + '/utils'
+
+libs = %w(current gem WEBrick EMongrel Thin)
+libs = ARGV if ARGV.any?
+
+benchmark "print", libs, 1000, [1, 10, 100]
diff --git a/test/benchmark/utils.rb b/test/benchmark/utils.rb
new file mode 100644
index 0000000..feb22c1
--- /dev/null
+++ b/test/benchmark/utils.rb
@@ -0,0 +1,82 @@
+
+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 \ No newline at end of file