【问题标题】:How to benchmark the Resque perform method or the Resque Job class?如何对 Resque perform 方法或 Resque Job 类进行基准测试?
【发布时间】:2012-05-09 11:54:55
【问题描述】:

我正在使用 Resque、Resque-Status 和 Resque-Retry 来处理 bkg 作业。 以下是一个示例作业。它对 4​​-5 个模型执行查询。 现在我想尝试使用Sidekiq,它的速度超过了 Resque。

但在此之前,我想在我的 rails 应用程序中对我的以下工作进行基准测试,以便稍后验证哪个表现最佳。

class BkgJob < Resque::JobWithStatus
  extend Resque::Plugins::Retry
  @retry_limit = 3
  @retry_delay = 60

  @queue = :critical

  def perform
    worker_id, station_id, ids = options['worker_id'], options['station_id'], options['ids']
    human_worker = Worker.find(human_worker_id)
    station = Station.find(station_id)
    .....
    .....
  end
end

那么,问题是如何对上述工作类或执行方法进行基准测试?我真的是基准测试的新手。

【问题讨论】:

    标签: ruby ruby-on-rails-3 benchmarking resque


    【解决方案1】:

    您在后台运行的作业的性能与 Resque 或 Sidekiq 几乎相同。但是,与 Resque 相比,Sidekiq 从队列中挑选作业的速度要快得多,并且内存效率要高得多。

    对后台作业进行基准测试仍然是一个好主意,但我想说您应该只对 perform 方法本身进行基准测试,而不是对排队和执行作业的整个过程进行基准测试。你可以这样做(一个 RSpec 示例):

    require 'benchmark'
    
    describe 'performance' do
      it 'takes time' do
        options = {'worker_id': 123, 'station_id': 456, 'ids': [1,2,3]}
        puts Benchmark.realtime do
           100.times { BkgJob.new(options).perform }
        end
      end
    end
    

    【讨论】:

    • 感谢您的回复。但我仍然担心工作中会发生的数据库调用。例如尽管您传递了选项哈希,但当调用执行时,这些数据库调用仍将被称为 Station.find(station_id) ?我是否足够清楚或错过了一些场景?
    • 对不起,我不够清楚。切换到 Sidekiq 后,您将不需要在作业中进行这些数据库调用。基本上,当作业排队时,Sidekiq 使用YAML.dump() 序列化参数,当作业开始时,它使用'YAML.load()' 反序列化参数。在 Ruby 中,您可以将任何对象及其所有属性转储到 YAML,包括 ActiveRecord 对象。当从转储中加载对象时,无需进一步查询数据库即可使用它。
    • 在您的应用程序中,您可以尝试运行station_dump = YAML.dump(Station.first),然后station = YAML.load(station) 将为您提供与您转储到字符串相同的 Station 对象。当然,有一些注意事项,例如,如果在调用之间删除了站,则恢复的站对象将具有所有属性,但是如果尝试保存它会出错。但考虑到这一点,将作业参数序列化为 YAML 可以节省数据库命中并带来一些性能提升。
    • 非常感谢您的解释。它有助于 sidekiq 与了解内部结构的 Resque 有何不同。根据您的解释,我理解在进行基准测试时,应该使用预先构建的数据而不是点击实际的数据库调用。我对吗?还是我需要真正打分贝?
    • 不,我并不是说您应该使用预先构建的数据。当你对 Resque 进行基准测试时,你应该只对命中数据库的当前方法进行基准测试。然后您为 Sidekiq 重写作业,因为它允许您将对象作为作业的参数传递,您可以从作业中删除 find 状态。您的perform 方法看起来像def perform(worker, station, whatever),并且无需访问数据库。但同样,这只是对 Sidekiq 工作的一个小提示,并不是 Sidekiq 的主要卖点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多