Class: RocketJob::Performance

Inherits:
Object
  • Object
show all
Defined in:
lib/rocket_job/performance.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePerformance

Returns a new instance of Performance.



7
8
9
10
11
12
13
14
15
# File 'lib/rocket_job/performance.rb', line 7

def initialize
  @version      = RocketJob::VERSION
  @ruby         = defined?(JRuby) ? "jruby_#{JRUBY_VERSION}" : "ruby_#{RUBY_VERSION}"
  @count        = 100_000
  @servers      = 0
  @workers      = 0
  @environment  = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
  @mongo_config = 'config/mongoid.yml'
end

Instance Attribute Details

#countObject

Returns the value of attribute count.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def count
  @count
end

#environmentObject

Returns the value of attribute environment.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def environment
  @environment
end

#mongo_configObject

Returns the value of attribute mongo_config.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def mongo_config
  @mongo_config
end

#rubyObject

Returns the value of attribute ruby.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def ruby
  @ruby
end

#serversObject

Returns the value of attribute servers.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def servers
  @servers
end

#versionObject

Returns the value of attribute version.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def version
  @version
end

#workersObject

Returns the value of attribute workers.



5
6
7
# File 'lib/rocket_job/performance.rb', line 5

def workers
  @workers
end

Instance Method Details

#count_running_workersObject



87
88
89
90
91
92
93
94
95
96
# File 'lib/rocket_job/performance.rb', line 87

def count_running_workers
  self.servers = 0
  self.workers = 0
  RocketJob::Server.running.each do |server|
    next if server.zombie?
    self.servers += 1
    self.workers += server.heartbeat.workers
  end
  puts "Running: #{workers} workers, distributed across #{servers} servers"
end

#export_results(results) ⇒ Object

Export the Results hash to a CSV file



59
60
61
62
63
64
# File 'lib/rocket_job/performance.rb', line 59

def export_results(results)
  CSV.open("job_results_#{ruby}_#{servers}s_#{workers}w_v#{version}.csv", 'wb') do |csv|
    csv << results.first.keys
    results.each { |result| csv << result.values }
  end
end

#parse(argv) ⇒ Object

Parse command line options



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/rocket_job/performance.rb', line 67

def parse(argv)
  parser        = OptionParser.new do |o|
    o.on('-c', '--count COUNT', 'Count of jobs to enqueue') do |arg|
      self.count = arg.to_i
    end
    o.on('-m', '--mongo MONGO_CONFIG_FILE_NAME', 'Path and filename of config file. Default: config/mongoid.yml') do |arg|
      self.mongo_config = arg
    end
    o.on('-e', '--environment ENVIRONMENT', 'The environment to run the app on (Default: RAILS_ENV || RACK_ENV || development)') do |arg|
      self.environment = arg
    end
  end
  parser.banner = 'rocketjob_perf <options>'
  parser.on_tail '-h', '--help', 'Show help' do
    puts parser
    exit 1
  end
  parser.parse! argv
end

#run_test_case(count = self.count) ⇒ Object

Loads the queue with jobs to be processed once the queue is loaded. Retain the first and last job for timings, all others are destroyed on completion.



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
# File 'lib/rocket_job/performance.rb', line 19

def run_test_case(count = self.count)
  raise 'Please start servers before starting the performance test' if RocketJob::Server.where(:state.in => ['running', 'paused']).count == 0

  count_running_workers

  puts 'Waiting for workers to pause'
  RocketJob::Server.pause_all
  RocketJob::Jobs::SimpleJob.delete_all

  # Wait for paused workers to stop
  loop do
    running = 0
    RocketJob::Server.paused.each do |server|
      running += server.heartbeat.workers unless server.zombie?
    end
    puts "Waiting for #{running} workers"
    break if running == 0
    sleep 1
  end

  puts 'Enqueuing jobs'
  first = RocketJob::Jobs::SimpleJob.create!(priority: 1, destroy_on_complete: false)
  (count - 2).times { |i| RocketJob::Jobs::SimpleJob.create! }
  last = RocketJob::Jobs::SimpleJob.create!(priority: 100, destroy_on_complete: false)

  puts 'Resuming workers'
  RocketJob::Server.resume_all

  while (!last.reload.completed?)
    sleep 3
  end

  duration = last.reload.completed_at - first.reload.started_at
  first.destroy
  last.destroy

  {count: count, duration: duration, jobs_per_second: (count.to_f / duration).to_i}
end