class RedisClusterCacheBenchmark::Spawner

Public Class Methods

new(options) click to toggle source
# File lib/redis_cluster_cache_benchmark/spawner.rb, line 8
def initialize(options)
  @base_name = "%s_%s_p%d_r%d" % [options[:classname] || 'Memory', options[:name], options[:process], options[:repeat]]
  @process_number = options.delete(:process).to_i
  @process_number = 5 if @process_number < 1
  @options = options
end

Public Instance Methods

calc_array_summary(f, path, caption, pattern, fmt) click to toggle source
# File lib/redis_cluster_cache_benchmark/spawner.rb, line 61
def calc_array_summary(f, path, caption, pattern, fmt)
  values = []
  File.open(path) do |f|
    f.each_line do |line|
      values.push line.scan(pattern).flatten.first.to_f
    end
  end
  summary = Summary.new(values)
  f.puts
  f.puts caption
  f.puts "cnt: #{summary[:cnt]}"
  %w[sum avg max 99 95 90 80 50 min].each do |k|
    f.puts fmt % [k, summary[k].to_f]
  end
end
process_rss(command_name) click to toggle source
# File lib/redis_cluster_cache_benchmark/spawner.rb, line 77
def process_rss(command_name)
  r = `ps a -o pid,command | grep #{command_name} | grep -v grep\\ #{command_name}`
  return 0 if r.nil? || r.empty?
  pid = r.strip.split(/\s+/, 2).first.to_i
  `ps -o rss= -p #{pid}`.to_i
end
run() click to toggle source
# File lib/redis_cluster_cache_benchmark/spawner.rb, line 15
def run
  FileUtils.mkdir_p(@options[:log_dir])
  redis_server_starting_rss = process_rss("redis-server")
  options = @options.each_with_object({}) do |(k,v), d|
    unless v.to_s.empty?
      d["RCCB_#{k.upcase}"] = v.to_s
    end
  end
  cmd = File.expand_path("../../../bin/worker", __FILE__)
  log_path_base = File.expand_path("#{@base_name}.log", @options[:log_dir])
  system("rm #{log_path_base}.*")
  pids = []
  @process_number.times do |idx|
    if log_path_base
      options["RCCB_LOG_PATH"] = "#{log_path_base}.#{idx + 1}"
    end
    options["RCCB_WORKER_NO"] = (idx + 1).to_s
    pids << Kernel.spawn(options, cmd)
  end
  pids.each do |pid|
    begin
      Process.waitpid(pid)
    rescue Errno::ECHILD => e
      $stderr.puts("WARN  [#{e.class}] #{e.message}")
    end
  end
  redis_server_completed_rss = process_rss("redis-server")
  system("cat #{log_path_base}.* > #{log_path_base}")
  system("grep \"\\[GET\\]\" #{log_path_base} > #{log_path_base}.get")
  system("grep \"\\[SET\\]\" #{log_path_base} > #{log_path_base}.set")
  system("grep \"\\[RSS\\] starting\" #{log_path_base} > #{log_path_base}.rss_starting")
  system("grep \"\\[RSS\\] completed\" #{log_path_base} > #{log_path_base}.rss_completed")

  File.open(File.expand_path("#{@base_name}.md", @options[:log_dir]), "w") do |f|
    calc_array_summary(f, "#{log_path_base}.get", "[GET]", / ([\d\.]+) microsec\Z/, "%3s: %9.3f microsec")
    calc_array_summary(f, "#{log_path_base}.set", "[SET]", / ([\d\.]+) microsec\Z/, "%3s: %9.3f microsec")
    calc_array_summary(f, "#{log_path_base}.rss_starting" , "memory before start"  , / \d+: (\d+) KB\Z/, "%3s: %d KB")
    calc_array_summary(f, "#{log_path_base}.rss_completed", "memory after complete", / \d+: (\d+) KB\Z/, "%3s: %d KB")
    f.puts
    f.puts "redis-server"
    f.puts "starting : #{redis_server_starting_rss} KB"
    f.puts "completed: #{redis_server_completed_rss} KB"
  end
  system("rm #{log_path_base}.*")
end