YUKI Hiroshi
null+****@clear*****
Mon Oct 7 17:47:03 JST 2013
YUKI Hiroshi 2013-10-07 17:47:03 +0900 (Mon, 07 Oct 2013) New Revision: d0059d7b556e3db54d1316bfedf3e6d7d732058f https://github.com/droonga/http-benchmark/commit/d0059d7b556e3db54d1316bfedf3e6d7d732058f Message: Indent Modified files: lib/droonga/http-benchmark/runner.rb Modified: lib/droonga/http-benchmark/runner.rb (+149 -149) =================================================================== --- lib/droonga/http-benchmark/runner.rb 2013-10-07 17:45:55 +0900 (281ce48) +++ lib/droonga/http-benchmark/runner.rb 2013-10-07 17:47:03 +0900 (462e838) @@ -6,183 +6,183 @@ require "json" module Droonga module HttpBenchmark - class Runner - attr_reader :duration, :n_clients - - MIN_DURATION = 1 - DEFAULT_DURATION = 10 - MIN_WAIT = 0 - DEFAULT_WAIT = 1 - MAX_N_CLIENTS = 16 - DEFAULT_N_CLIENTS = 1 - TOTAL_N_REQUESTS = 1000 - - DEFAULT_HOST = "localhost" - DEFAULT_PORT = 80 - DEFAULT_PATH = "/" - DEFAULT_METHOD = "GET" - - def initialize(params) - @duration = [params[:duration] || DEFAULT_DURATION, MIN_DURATION].max - @wait = [params[:wait] || DEFAULT_WAIT, MIN_WAIT].max - @n_clients = [params[:n_clients] || DEFAULT_N_CLIENTS, MAX_N_CLIENTS].min - @n_requests = params[:n_requests] || TOTAL_N_REQUESTS - - @default_host = params[:host] || DEFAULT_HOST - @default_port = params[:port] || DEFAULT_PORT - @default_path = params[:path] || DEFAULT_PATH - @default_method = params[:method] || DEFAULT_METHOD - - if params[:request_pattern] - params[:request_pattern][:frequency] = 1 - @request_patterns = [params[:request_pattern]] - else - @request_patterns = params[:request_patterns] + class Runner + attr_reader :duration, :n_clients + + MIN_DURATION = 1 + DEFAULT_DURATION = 10 + MIN_WAIT = 0 + DEFAULT_WAIT = 1 + MAX_N_CLIENTS = 16 + DEFAULT_N_CLIENTS = 1 + TOTAL_N_REQUESTS = 1000 + + DEFAULT_HOST = "localhost" + DEFAULT_PORT = 80 + DEFAULT_PATH = "/" + DEFAULT_METHOD = "GET" + + def initialize(params) + @duration = [params[:duration] || DEFAULT_DURATION, MIN_DURATION].max + @wait = [params[:wait] || DEFAULT_WAIT, MIN_WAIT].max + @n_clients = [params[:n_clients] || DEFAULT_N_CLIENTS, MAX_N_CLIENTS].min + @n_requests = params[:n_requests] || TOTAL_N_REQUESTS + + @default_host = params[:host] || DEFAULT_HOST + @default_port = params[:port] || DEFAULT_PORT + @default_path = params[:path] || DEFAULT_PATH + @default_method = params[:method] || DEFAULT_METHOD + + if params[:request_pattern] + params[:request_pattern][:frequency] = 1 + @request_patterns = [params[:request_pattern]] + else + @request_patterns = params[:request_patterns] + end + populate_requests end - populate_requests - end - def run - process_requests - analyze_results - end + def run + process_requests + analyze_results + end - private - def process_requests - requests_queue = Queue.new - results_queue = Queue.new - - @client_threads = 0.upto(@n_clients).collect do |index| - Thread.new do - loop do - next if requests_queue.empty? - request = requests_queue.pop - Net::HTTP.start(request[:host], request[:port]) do |http| - header = { - "user-agent" => "Ruby/#{RUBY_VERSION} Droonga::HttpBenchmark" - } - response = nil - start_time = Time.now - case request[:method] - when "GET" - response = http.get(request[:path], header) - when "POST" - body = request[:body] - unless body.is_a?(String) - body = JSON.generate(body) + private + def process_requests + requests_queue = Queue.new + results_queue = Queue.new + + @client_threads = 0.upto(@n_clients).collect do |index| + Thread.new do + loop do + next if requests_queue.empty? + request = requests_queue.pop + Net::HTTP.start(request[:host], request[:port]) do |http| + header = { + "user-agent" => "Ruby/#{RUBY_VERSION} Droonga::HttpBenchmark" + } + response = nil + start_time = Time.now + case request[:method] + when "GET" + response = http.get(request[:path], header) + when "POST" + body = request[:body] + unless body.is_a?(String) + body = JSON.generate(body) + end + response = http.post(request[:path], body, header) end - response = http.post(request[:path], body, header) + results_queue.push(:request => request, + :status => response.code, + :elapsed_time => Time.now - start_time) end - results_queue.push(:request => request, - :status => response.code, - :elapsed_time => Time.now - start_time) + sleep request[:wait] end - sleep request[:wait] end end - end - start_time = Time.now - while Time.now - start_time < @duration - if requests_queue.empty? - @requests.each do |request| - requests_queue.push(request) + start_time = Time.now + while Time.now - start_time < @duration + if requests_queue.empty? + @requests.each do |request| + requests_queue.push(request) + end end + sleep 1 end - sleep 1 - end - @client_threads.each do |client_thread| - client_thread.exit - end + @client_threads.each do |client_thread| + client_thread.exit + end - @results = [] - while not results_queue.empty? - @results << results_queue.pop + @results = [] + while not results_queue.empty? + @results << results_queue.pop + end end - end - def analyze_results - total_n_requests =****@resul***** - http_statuses = {} - min_elapsed_time = @duration - max_elapsed_time = 0 - total_elapsed_time = 0 + def analyze_results + total_n_requests =****@resul***** + http_statuses = {} + min_elapsed_time = @duration + max_elapsed_time = 0 + total_elapsed_time = 0 - @results.each do |result| - http_statuses[result[:status]] ||= 0 - http_statuses[result[:status]] += 1 + @results.each do |result| + http_statuses[result[:status]] ||= 0 + http_statuses[result[:status]] += 1 - if result[:elapsed_time] < min_elapsed_time - min_elapsed_time = result[:elapsed_time] - end - if result[:elapsed_time] > max_elapsed_time - max_elapsed_time = result[:elapsed_time] + if result[:elapsed_time] < min_elapsed_time + min_elapsed_time = result[:elapsed_time] + end + if result[:elapsed_time] > max_elapsed_time + max_elapsed_time = result[:elapsed_time] + end + total_elapsed_time += result[:elapsed_time] end - total_elapsed_time += result[:elapsed_time] - end - http_status_percentages = [] - http_statuses.each do |status, n_results| - percentage = n_results.to_f / total_n_requests * 100 - http_status_percentages << { :percentage => percentage, - :status => status } - end - http_status_percentages.sort! do |a, b| - (-1) * (a[:percentage] <=> b[:percentage]) - end + http_status_percentages = [] + http_statuses.each do |status, n_results| + percentage = n_results.to_f / total_n_requests * 100 + http_status_percentages << { :percentage => percentage, + :status => status } + end + http_status_percentages.sort! do |a, b| + (-1) * (a[:percentage] <=> b[:percentage]) + end - puts "Total requests: #{total_n_requests} " + - "(#{total_n_requests.to_f / @duration} queries per second)" - puts "Status:" - http_status_percentages.each do |status| - puts " #{status[:status]}: #{status[:percentage]} %" + puts "Total requests: #{total_n_requests} " + + "(#{total_n_requests.to_f / @duration} queries per second)" + puts "Status:" + http_status_percentages.each do |status| + puts " #{status[:status]}: #{status[:percentage]} %" + end + puts "Elapsed time:" + puts " min: #{min_elapsed_time} sec" + puts " max: #{max_elapsed_time} sec" + puts " average: #{total_elapsed_time / total_n_requests} sec" end - puts "Elapsed time:" - puts " min: #{min_elapsed_time} sec" - puts " max: #{max_elapsed_time} sec" - puts " average: #{total_elapsed_time / total_n_requests} sec" - end - def populate_requests - @requests = [] + def populate_requests + @requests = [] - if @request_patterns.is_a?(Array) - @request_patterns.each do |request_pattern| - populate_request_pattern(request_pattern) - end - else - @request_patterns.each do |key, request_pattern| - populate_request_pattern(request_pattern) + if @request_patterns.is_a?(Array) + @request_patterns.each do |request_pattern| + populate_request_pattern(request_pattern) + end + else + @request_patterns.each do |key, request_pattern| + populate_request_pattern(request_pattern) + end end - end - @requests.shuffle! - end + @requests.shuffle! + end - def populate_request_pattern(request_pattern) - frequency = request_pattern[:frequency].to_f - n_requests = @n_requests * frequency + def populate_request_pattern(request_pattern) + frequency = request_pattern[:frequency].to_f + n_requests = @n_requests * frequency - base_patterns = nil - if request_pattern[:pattern] - base_patterns = [request_pattern[:pattern]] - else - base_patterns = request_pattern[:patterns] - end - base_patterns = base_patterns.shuffle - - n_requests.round.times do |count| - request = base_patterns[count % base_patterns.size] - request[:host] ||= @default_host - request[:port] ||= @default_port - request[:path] ||= @default_path - request[:method] ||= @default_method - request[:method] = request[:method].upcase - request[:wait] ||= @wait - @requests << request + base_patterns = nil + if request_pattern[:pattern] + base_patterns = [request_pattern[:pattern]] + else + base_patterns = request_pattern[:patterns] + end + base_patterns = base_patterns.shuffle + + n_requests.round.times do |count| + request = base_patterns[count % base_patterns.size] + request[:host] ||= @default_host + request[:port] ||= @default_port + request[:path] ||= @default_path + request[:method] ||= @default_method + request[:method] = request[:method].upcase + request[:wait] ||= @wait + @requests << request + end end end end - end end -------------- next part -------------- HTML����������������������������... Download