检测哪些Sidekiq作业负责高内存使用

时间:2018-01-22 11:07:59

标签: ruby-on-rails ruby heroku sidekiq newrelic

我在Heroku上运行应用程序并使用Sidekiq作为作业队列系统。但是,最近,内存使用率始终在90%-110%左右。

我已经尝试过一点点减少并发性并扩展工作者数量,但没有取得很大成功。有没有办法检测哪些Sidekiq作业消耗了如此多的内存?

我们使用New Relic来跟踪我们的交易,但我在平台上找不到这些信息。

1 个答案:

答案 0 :(得分:1)

我遇到类似的情况,我需要跟踪工人使用的内存,我已经提出了以下解决方案,不确定它是否可以帮助你,但我希望它能找到正确的方向来找到解决方案< / p>

我编写了一个cron作业,它收集当前正在运行的工作者(非实时)和内存使用情况,并将其存储到csv文件中。以下是代码。

class DataWorker
  include Sidekiq::Worker

  def perform
    file = File.new("sidekiq_profiling.csv", "a")
    memory_usage = gc_start
    workers = Sidekiq::Workers.new
    worker_running_counts = workers.map {|pid, thrd, wrkr| wrkr["payload"]["class"]}.group_by {|cls| cls}.map {|k, v| {k => v.count}}
    datetime = DateTime.now
    worker_running_counts.each do |wc|
      file << "#{datetime},#{wc.keys[0]},#{wc.values[0]},#{memory_usage}\n"
    end
    file.close
  end


  def rss_usage
    `ps -o rss= -p #{Process.pid}`.chomp.to_i * 1024
  end

  # def gc_stats
  #   GC.stat.slice(:heap_available_slots, :heap_live_slots, :heap_free_slots)
  # end

  def gc_start
    GC.start
    # gc_stats.each do |key, value|
    #   puts "GC.#{key}: #{value.to_s(:delimited)}"
    # end
    "#{rss_usage.to_s(:human_size, precision: 3)}"
  end

  Sidekiq::Cron::Job.create(name: 'DataWorker', cron: '* * * * *', class: 'DataWorker')
end