Sha256: d8ef36d1914d394327b840e3e7e8dd3b05da7d3a7f45b0f09a3ed03e3fed47ee

Contents?: true

Size: 1.83 KB

Versions: 6

Compression:

Stored size: 1.83 KB

Contents

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 'gem' # Load the current Thin gem
      require 'thin'
      handler_name = 'Thin'
    
    when 'current' # Load the current Thin version under /lib
      require File.dirname(__FILE__) + '/../lib/thin'
      handler_name = 'Thin'
      
    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

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
thin-0.6.2 benchmark/utils.rb
thin-0.6.2-x86-mswin32-60 benchmark/utils.rb
thin-0.6.4-x86-mswin32-60 benchmark/utils.rb
thin-0.6.4 benchmark/utils.rb
thin-0.6.3 benchmark/utils.rb
thin-0.6.3-x86-mswin32-60 benchmark/utils.rb