class AbCrunch::StrategyBestConcurrency

Public Class Methods

calc_threshold(baseline_latency, percent_buffer, max_latency) click to toggle source
# File lib/abcrunch/strategy_best_concurrency.rb, line 4
def self.calc_threshold(baseline_latency, percent_buffer, max_latency)
  [max_latency, baseline_latency * (1 + percent_buffer)].min
end
find_best_concurrency(page, baseline_result) click to toggle source
# File lib/abcrunch/strategy_best_concurrency.rb, line 8
def self.find_best_concurrency(page, baseline_result)
  threshold_ms = calc_threshold(baseline_result.avg_response_time, page[:max_degradation_percent], page[:max_latency].to_f)

  AbCrunch::Logger.log :task, "Finding the max concurrency without degrading performance beyond a threshold"
  AbCrunch::Logger.log :info, "Threshold: #{threshold_ms} (ms)"
  AbCrunch::Logger.log :info, "Trying ever increasing concurrency until we bust the threshold"

  fmc_page = page.clone
  fmc_page[:concurrency] = 0
  abr = baseline_result
  begin
    fmc_page[:concurrency] += 1
    prev_result = abr
    abr = AbCrunch::BestRun.of_avg_response_time(fmc_page[:num_concurrency_runs], fmc_page)
  end while abr.avg_response_time < threshold_ms and fmc_page[:concurrency] < fmc_page[:num_requests]
  if abr.avg_response_time < threshold_ms
    return abr || baseline_result
  else
    fmc_page[:concurrency] -= 1
    return prev_result || baseline_result
  end
end
run(page) click to toggle source
# File lib/abcrunch/strategy_best_concurrency.rb, line 31
def self.run(page)
  page = AbCrunch::Config.best_concurrency_options.merge(page)

  AbCrunch::Logger.log :strategy, "Strategy: find queries per second (QPS) at highest concurrency before latency degrades"

  AbCrunch::Logger.log :task, "Calculating Baseline (min average response time over multiple runs)"
  baseline_result = AbCrunch::BestRun.of_avg_response_time(page[:num_baseline_runs], page)

  best_result = find_best_concurrency(page, baseline_result)

  AbCrunch::Logger.log :progress, "Highest concurrency without degrading latency: #{best_result.ab_options[:concurrency]}"
  AbCrunch::Logger.log :result, "Queries Per Second (QPS): #{best_result.queries_per_second}"
  best_result.log

  best_result
end