From f0a23d50b490313c83d689f6c3d4cc12dafde04b Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 24 Jul 2018 17:56:51 +1000 Subject: [PATCH] DEV: add script for testing memory usage in sidekiq --- script/mwrap_sidekiq | 110 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100755 script/mwrap_sidekiq diff --git a/script/mwrap_sidekiq b/script/mwrap_sidekiq new file mode 100755 index 00000000000..318e483366a --- /dev/null +++ b/script/mwrap_sidekiq @@ -0,0 +1,110 @@ +#!/usr/bin/env ruby +if !ENV["LD_PRELOAD"]&.include?('mwrap') + ENV['RAILS_ENV'] = 'production' + exec "mwrap #{__FILE__}" +end + +require 'mwrap' +require 'webrick' + +require File.expand_path("../../config/environment", __FILE__) + +def render_table(array) + buffer = +"" + + width = array[0].map { |k| k.to_s.length } + cols = array[0].length + + array.each do |row| + row.each_with_index do |val, i| + width[i] = [width[i].to_i, val.to_s.length].max + end + end + + array[0].each_with_index do |col, i| + buffer << col.to_s.ljust(width[i], ' ') + if i == cols - 1 + buffer << "\n" + else + buffer << ' | ' + end + end + + buffer << ("-" * (width.sum + width.length)) + buffer << "\n" + + array.drop(1).each do |row| + row.each_with_index do |val, i| + buffer << val.to_s.ljust(width[i], ' ') + if i == cols - 1 + buffer << "\n" + else + buffer << ' | ' + end + end + end + + buffer +end + +def mwrap_log + report = +"" + + Mwrap.quiet do + report << "Generation: #{GC.count}\n\n" + + table = [] + Mwrap.each(200) do |loc, total, allocations, frees, age_sum, max_life| + table << [total, allocations, frees, frees == 0 ? -1 : (age_sum / frees.to_f).round(2), max_life, loc] + end + + table.sort! { |a, b| b[1] - b[2] <=> a[1] - a[2] } + + table.prepend(["total", "allocations", "frees", "mean_life", "max_life", "location"]) + + report << render_table(table) + end + + report +end + +Thread.new do + puts "Starting WEBrick on port 9874" + server = WEBrick::HTTPServer.new(Port: 9874) + server.mount_proc '/' do |req, res| + res['ContentType'] = 'text/plain; charset=utf-8' + res.body = mwrap_log + res.status = 200 + end + begin + server.start + rescue => e + STDERR.puts "Failed to start start server #{e}" + end +end + +require 'sidekiq/cli' + +begin + #Sidekiq::Logging.logger = nil + cli = Sidekiq::CLI.instance + + options = ["-c", GlobalSetting.sidekiq_workers.to_s] + + [['critical', 4], ['default', 2], ['low', 1]].each do |queue_name, weight| + custom_queue_hostname = ENV["UNICORN_SIDEKIQ_#{queue_name.upcase}_QUEUE_HOSTNAME"] + + if !custom_queue_hostname || custom_queue_hostname.split(',').include?(`hostname`.strip) + options << "-q" + options << "#{queue_name},#{weight}" + end + end + + cli.parse(options) + load Rails.root + "config/initializers/100-sidekiq.rb" + cli.run +rescue => e + STDERR.puts e.message + STDERR.puts e.backtrace.join("\n") + exit 1 +end