Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 检测哪些Sidekiq作业导致内存使用率高_Ruby On Rails_Ruby_Heroku_Sidekiq_Newrelic - Fatal编程技术网

Ruby on rails 检测哪些Sidekiq作业导致内存使用率高

Ruby on rails 检测哪些Sidekiq作业导致内存使用率高,ruby-on-rails,ruby,heroku,sidekiq,newrelic,Ruby On Rails,Ruby,Heroku,Sidekiq,Newrelic,我在Heroku上运行了一个应用程序,并使用Sidekiq作为作业队列系统。然而,最近,内存使用率总是在90%-110%左右 我已经尝试过稍微降低并发性并扩展工作人员的数量,但没有取得很大的成功。有没有办法检测哪些Sidekiq作业占用了这么多内存 我们使用New Relic跟踪我们的交易,但我在平台上找不到这些信息。我遇到了类似的情况,我需要跟踪工作人员使用的内存,我提出了以下解决方案,不确定它是否能帮助您,但我希望它能为找到解决方案确定正确的方向 我编写了一个cron作业,它收集当前正在运行

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

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


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

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

我编写了一个cron作业,它收集当前正在运行的worker(非实时)和内存使用情况,并将其存储到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
类数据工作者
包括Sidekiq::Worker
def执行
file=file.new(“sidekiq_profiling.csv”,“a”)
内存使用率=gc\u启动
workers=Sidekiq::workers.new
worker|u running|u counts=workers.map{pid,thrd,wrkr|wrkr[“payload”][“class”]}.group_by{cls | cls}.map{k,v{k=>v.count}
datetime=datetime.now
工人|运行|计数。每个人都做| wc|

您可以限制Redis的最大连接数。如果您只需要检查一会儿,您可以将其视为newrelic。它为您完成了大部分工作,因此@Dipil可能会更快,我已经使用New Relic跟踪了作业的平均响应时间,但我无法确定是否可能以及如何确定这些作业的平均内存使用率。谢谢bhanu。是否可以使用此脚本确定当前在这些工人身上运行的Sidekiq作业?您可以尝试绘制csv文件@felipeecst中收集的数据