Ruby on rails 检测哪些Sidekiq作业导致内存使用率高
我在Heroku上运行了一个应用程序,并使用Sidekiq作为作业队列系统。然而,最近,内存使用率总是在90%-110%左右 我已经尝试过稍微降低并发性并扩展工作人员的数量,但没有取得很大的成功。有没有办法检测哪些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作业,它收集当前正在运行
我们使用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中收集的数据