我在 Heroku 上运行一个应用程序并使用 Sidekiq 作为作业队列系统。不过最近内存使用率一直在90%-110%左右。
我已经尝试过稍微减少并发性并扩大工作人员的数量,但没有取得很大的成功。有没有办法检测哪些 Sidekiq 作业消耗了这么多内存?
我们使用 New Relic 来跟踪我们的交易,但我在平台上找不到此信息。
最佳答案
我遇到了类似的情况,我需要跟踪工作人员使用的内存,我提出了以下解决方案,不确定它是否可以帮助您,但我希望它能为找到解决方案设定正确的方向
我编写了一个 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
关于ruby-on-rails - 检测哪些 Sidekiq 作业导致高内存使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380182/