ry / ebb fork watch download tarball
public
Description: web server
Homepage: http://ebb.rubyforge.org
Clone URL: git://github.com/ry/ebb.git
Search Repo:
Ryan Dahl (author)
Thu Mar 20 09:51:55 -0700 2008
commit  cebd9c9cba0549bc78c1459f85e8ea3eb6330771
tree    d980e69a61ce022b311bf60d5db844a3d4bc3856
parent  9b659b2e0f56a35f1ab0fd1f9e4508eb9ab9adf8
ebb / benchmark / bench
100755 70 lines (64 sloc) 1.993 kb
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env ruby
 
require File.dirname(__FILE__) + "/server_test"
# supported servers: mongrel, emongrel, ebb, thin
# use another name an a already open port for anything else
usage = "e.g. server_bench response_size ebb:4001 mongrel:4002 other:4003"
 
benchmark = ARGV.shift
 
servers = []
ARGV.each do |server|
  name, port = server.split(':')
  servers << ServerTest.new(name, port)
end
 
trials = {
  'response_size' => [0.1,1,5,7,10,15,18,20,23,25,30,40,45,50].map { |i|
    bytes = (i*1024).to_i
    [i, "ab -t 3 -q -c 50 http://0.0.0.0:PORT/bytes/#{bytes}"]
  },
  'wait_fib' => [1,20,40,60,80,100].map { |c|
    [c, "ab -t 3 -q -c #{c} http://0.0.0.0:PORT/periodical_activity/fibonacci/15"]
  },
  'wait' => [0.5,1,1.5,2,2.5,3,3.5].map { |t|
    [t, "ab -t 6 -q -c 50 http://0.0.0.0:PORT/periodical_activity/wait/#{t}"]
  },
  'post_size' => [0.1,1,5,7,10,15,18,20,23,25,30,35,37,40,45,50].map { |l|
    size = (l * 1024).to_i
    fn = "/tmp/ebb_post_trial_#{size}"
    File.open(fn, 'w+') { |f| f.write("C"*size) } unless FileTest.exists?(fn)
    [l, "ab -t 6 -q -c 50 -p #{fn} http://0.0.0.0:PORT/test_post_length"]
  },
  'concurrency' => [1,2,5,10,20,25,30,35,40,50,75,100].map { |c|
    [c, "ab -t 3 -q -c #{c} http://0.0.0.0:PORT/bytes/1"]
  }
}
 
unless trials.has_key? benchmark
  puts("must specify valid benchmark: #{trials.keys.join(" or ")}")
  exit 1
end
 
trap('INT') { exit(1) }
dumpfile = "#{benchmark}.dump"
begin
  results = ServerTestResults.open(dumpfile)
  servers.each { |s| s.start }
  sleep 4
  trials[benchmark].rand_each do |x, cmd|
    servers.rand_each do |server|
      result = server.trial(cmd)
      if result.nil?
        server.kill
        sleep 0.5
        server.start
        sleep 2
      else
        result[:benchmark] = benchmark
        result[:input] = x
        results << result
      end
      sleep 1
    end
    puts "---"
  end
ensure
  puts "\n\nkilling servers"
  servers.each { |server| server.kill }
  results.write(dumpfile)
end