0
+$: << File.expand_path(File.dirname(__FILE__) + '/..')
0
+ alias :kilobyte :kilobytes
0
+ alias :megabyte :megabytes
0
+ alias :gigabyte :gigabytes
0
+ alias :terabyte :terabytes
0
+ alias :petabyte :petabytes
0
+ alias :exabyte :exabytes
0
+def number_to_human_size(size, precision=1)
0
+ size = Kernel.Float(size)
0
+ when size.to_i == 1; "1 Byte"
0
+ when size < 1.kilobyte; "%d Bytes" % size
0
+ when size < 1.megabyte; "%.#{precision}f KB" % (size / 1.0.kilobyte)
0
+ when size < 1.gigabyte; "%.#{precision}f MB" % (size / 1.0.megabyte)
0
+ when size < 1.terabyte; "%.#{precision}f GB" % (size / 1.0.gigabyte)
0
+ else "%.#{precision}f TB" % (size / 1.0.terabyte)
0
+ end.sub(/([0-9])\.?0+ /, '\1 ' )
0
+ inject(0) { |i, s| s += i }
0
+ sort_by{ rand }.each &block
0
+class ServerTestResults
0
+ def self.open(filename)
0
+ if File.readable?(filename)
0
+ new(Marshal.load(File.read(filename)))
0
+ def initialize(results = [])
0
+ def write(filename='results.dump')
0
+ puts "writing dump file to #{filename}"
0
+ File.open(filename, 'w+') do |f|
0
+ f.write Marshal.dump(@results)
0
+ @results.map {|r| r[:server] }.uniq.sort
0
+ def data(server, what=:size)
0
+ server_data = @results.find_all { |r| r[:server] == server }
0
+ ticks = server_data.map { |d| d[what] }.uniq
0
+ measurements = server_data.find_all { |d| d[what] == c }.map { |d| d[:rps] }
0
+ datas << [c, measurements.avg]
0
+ attr_reader :name, :port, :app, :pid
0
+ def initialize(name, port, &start_block)
0
+ @start_block = start_block
0
+ Process.kill('KILL', @pid)
0
+ puts "Starting #{name}"
0
+ @pid = fork { @start_block.call }
0
+ def trial(options = {})
0
+ concurrency = options[:concurrency] || 50
0
+ size = options[:size] || 20 * 1.kilobyte
0
+ requests = options[:requests] || 500
0
+ print "#{@name} (c=#{concurrency},s=#{size}) "
0
+ r = %x{ab -t 3 -q -c #{concurrency} http://0.0.0.0:#{@port}/bytes/#{size}}
0
+ # Complete requests: 1000
0
+ return nil unless r =~ /Requests per second:\s*(\d+\.\d\d)/
0
+ if r =~ /Complete requests:\s*(\d+)/
0
+ completed_requests = $1.to_i
0
+ puts "#{rps} req/sec (#{completed_requests} completed)"
0
+ :concurrency => concurrency,
0
+ :requests => requests,
0
+ :requests_completed => completed_requests,
0
+ def wait_trial(wait, concurrency = 50)
0
+ print "#{@name} (c=#{concurrency},wait=#{wait}) "
0
+ r = %x{ab -t #{wait*3} -q -c #{concurrency} http://0.0.0.0:#{@port}/periodical_activity/fibonacci/#{wait}}
0
+ # Complete requests: 1000
0
+ return nil unless r =~ /Requests per second:\s*(\d+\.\d\d)/
0
+ if r =~ /Complete requests:\s*(\d+)/
0
+ completed_requests = $1.to_i
0
+ puts "#{rps} req/sec (#{completed_requests} completed)"
0
+ :concurrency => concurrency,
0
+ :requests_completed => completed_requests,
0
+ def post_trial(size = 1, concurrency = 10)
0
+ print "#{@name} (c=#{concurrency},posting=#{size}) "
0
+ fn = "/tmp/ebb_post_trial_#{size}"
0
+ unless FileTest.exists?(fn)
0
+ File.open(fn, 'w+') { |f| f.write("C"*size) }
0
+ r = %x{ab -t 6 -q -c #{concurrency} -p #{fn} http://0.0.0.0:#{@port}/test_post_length}
0
+ return nil unless r =~ /Requests per second:\s*(\d+\.\d\d)/
0
+ if r =~ /Complete requests:\s*(\d+)/
0
+ completed_requests = $1.to_i
0
+ puts "#{rps} req/sec (#{completed_requests} completed)"
0
+ :concurrency => concurrency,
0
+ :requests_completed => completed_requests,
0
+$servers << ServerTest.new('evented mongrel', 4001) do
0
+ require 'swiftcore/evented_mongrel'
0
+ Rack::Handler::Mongrel.run(app, :Port => 4001)
0
+$servers << ServerTest.new('ebb', 4002) do
0
+ require File.dirname(__FILE__) + '/../ruby_lib/ebb'
0
+ server = Ebb::Server.new(app, :port => 4002)
0
+$servers << ServerTest.new('mongrel', 4003) do
0
+ Rack::Handler::Mongrel.run(app, :Port => 4003)
0
+$servers << ServerTest.new('thin', 4004) do
0
+ Rack::Handler::Thin.run(app, :Port => 4004)