From 03f1d87de53de35d78a5ee5ae1c40b65586f2912 Mon Sep 17 00:00:00 2001 From: evanweaver Date: Wed, 20 Feb 2008 05:49:44 +0000 Subject: Add concurrency benchmarks, mostly copied from Thin's. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/branches/stable_1-1@971 19e92222-5c0b-0410-8929-a290d50e31e9 --- test/benchmark/previous.rb | 11 +++++++ test/benchmark/simple.rb | 11 +++++++ test/benchmark/utils.rb | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 test/benchmark/previous.rb create mode 100644 test/benchmark/simple.rb create mode 100644 test/benchmark/utils.rb (limited to 'test/benchmark') 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 -- cgit v1.2.3-24-ge0c7