【问题标题】:Detect which Sidekiq jobs are responsible for high memory usage检测哪些 Sidekiq 作业对高内存使用负责
【发布时间】:2018-07-01 00:02:16
【问题描述】:

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

我已经尝试稍微降低并发性并扩大工作人员的数量,但没有取得太大的成功。有没有办法检测哪些 Sidekiq 作业消耗了这么多内存?

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

【问题讨论】:

  • 您可以限制Redis 最大连接数
  • 如果你只是需要检查一小会,你可以作为newrelic看看。它为您完成大部分工作,因此可能会更快docs.newrelic.com/docs/agents/ruby-agent/background-jobs/…
  • @Dipil,我已经使用 New Relic 跟踪了作业的平均响应时间,但我不知道这是否可行以及如何确定这些作业的平均内存使用情况。

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


【解决方案1】:

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

我编写了一个 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

【讨论】:

  • 谢谢bhanu。是否可以使用此脚本确定当前在这些工作人员上运行哪个 Sidekiq 作业?
  • 您可以尝试绘制csv文件@felipeecst中收集的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2017-04-08
  • 2017-09-14
  • 2022-06-16
  • 2014-07-09
相关资源
最近更新 更多