Class: RocketJob::Batch::Performance

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePerformance

Returns a new instance of Performance.



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

def initialize
  @count        = 10_000_000
  @environment  = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
  @mongo_config = "config/mongoid.yml"
  @compress     = false
  @encrypt      = false
  @slice_size   = 1000
end

Instance Attribute Details

#compressObject

Returns the value of attribute compress.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def compress
  @compress
end

#countObject

Returns the value of attribute count.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def count
  @count
end

#encryptObject

Returns the value of attribute encrypt.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def encrypt
  @encrypt
end

#environmentObject

Returns the value of attribute environment.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def environment
  @environment
end

#mongo_configObject

Returns the value of attribute mongo_config.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def mongo_config
  @mongo_config
end

#rubyObject

Returns the value of attribute ruby.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def ruby
  @ruby
end

#serversObject

Returns the value of attribute servers.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def servers
  @servers
end

#slice_sizeObject

Returns the value of attribute slice_size.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def slice_size
  @slice_size
end

#versionObject

Returns the value of attribute version.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def version
  @version
end

#workersObject

Returns the value of attribute workers.



7
8
9
# File 'lib/rocket_job/batch/performance.rb', line 7

def workers
  @workers
end

Instance Method Details

#count_running_workersObject



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/rocket_job/batch/performance.rb', line 96

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



55
56
57
58
59
60
61
62
63
# File 'lib/rocket_job/batch/performance.rb', line 55

def export_results(results)
  ruby    = defined?(JRuby) ? "jruby_#{JRUBY_VERSION}" : "ruby_#{RUBY_VERSION}"
  version = RocketJob::VERSION

  CSV.open("job_results_#{ruby}_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



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rocket_job/batch/performance.rb', line 66

def parse(argv)
  parser = OptionParser.new do |o|
    o.on("-c", "--count COUNT", "Count of records to enqueue") do |arg|
      self.count = arg.to_i
    end
    o.on("-m", "--mongo MONGO_CONFIG_FILE_NAME", "Location of mongoid.yml config file") 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
    o.on("-z", "--compress", "Turn on compression") do
      self.compress = true
    end
    o.on("-E", "--encrypt", "Turn on encryption") do
      self.encrypt = true
    end
    o.on("-s", "--slice_size COUNT", "Slice size") do
      self.slice_size = arg.to_i
    end
  end
  parser.banner = "rocketjob_batch_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



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

def run_test_case(count = self.count)
  servers = RocketJob::Server.count
  raise "Please start workers before starting the performance test" if servers.zero?

  count_running_workers

  puts "Loading job with #{count} records/lines"
  job                           = RocketJob::Jobs::PerformanceJob.new(log_level: :warn)
  job.input_category.slice_size = slice_size
  if encrypt
    job.input_category.serializer  = :encrypt
    job.output_category.serializer = :encrypt
  elsif !compress
    job.input_category.serializer  = :none
    job.output_category.serializer = :none
  end
  job.upload do |writer|
    count.times { |i| writer << i }
  end
  job.save!

  puts "Waiting for job to complete"
  sleep 3 until job.reload.completed?

  duration = job.completed_at - job.started_at
  {
    count:              count,
    duration:           duration,
    records_per_second: (count.to_f / duration).round(3),
    workers:            workers,
    servers:            servers,
    compress:           compress,
    encrypt:            encrypt
  }
end