【问题标题】:Resque worker logging slows down Rails responsivenessResque worker 日志会减慢 Rails 的响应速度
【发布时间】:2012-05-31 02:47:51
【问题描述】:

我有一个 Resque 作业,它从远程服务器中提取 csv 数据列表,然后运行 ​​+40k 条目以将任何新项目添加到现有数据库表中。该作业运行良好,但它严重减慢了对服务器的任何后续请求的响应时间。在我启动“bundle exec rails server”的控制台中,虽然作业正在运行,但我看不到打印语句。然而,一旦我点击了我的 Rails 服务器(通过页面引用),我看到多个 SELECT / INSERT 语句在服务器响应之前滚动。 SELECT/INSERT 语句显然是由我的 Resque 作业生成的,但奇怪的是,它们等待打印到我通过浏览器访问服务器的控制台单元。

确实感觉我做错了什么或没有遵循“轨道方式”。建议?

这是我的 Resque 作业中执行 SELECT/INSERTS 的代码

# data is an array of hashes formed from parsing csv input. Max size is 1000
ActiveRecord::Base.transaction do
  data.each do |h|
    MyModel.find_or_create_by_X_and_Y( h[:x], h[:y], h )
  end
end

软件堆栈

  • Rails 3.2.0
  • postgresql 9.1
  • Resque 1.20.0

编辑

我终于花时间再调试一下。即使是一个非常简单的工作者,如下所示,也会减慢下一个服务器响应。在我启动 rail sever 进程的控制台中,我看到只有在我 ping 服务器后才打印来自工作人员的 b/c stdout 延迟。

  def perform()
    s = Time.now
    0.upto( 90000 ) do |i|
      Rails.logger.debug  i * i
    end
    e = Time.now
    Rails.logger.info "Start: #{s} ---- End #{e}"
    Rails.logger.info "Total Time: #{e - s }"
  end

如果我在启动 rails 时抑制 stdout,我可以让 rails 服务器再次恢复正常响应,但似乎没有必要这样做...bundle exec rails server > /dev/nul

关于解决此问题的更好方法的任何意见?

【问题讨论】:

  • 我删除了 PostgreSQL 标签,因为它们不是问题的关键——正如您的示例所示,您可以在没有数据库的情况下重新创建。

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


【解决方案1】:

我认为this answer to "Logging issues with Resque" 会有所帮助。

处于开发模式的 Rails 服务器打开了日志文件。我的理解——我需要确认这一点——是它在写入任何新内容之前刷新日志,以保持顺序。如果您将 Rails 服务器连接到终端,它希望首先输出所有更改!如果您的工作人员已将大量数据写入日志,这可能会导致大量延迟。

注意:这已经发生在我身上一段时间了,但我最近才开始关注它。

【讨论】:

  • 感谢您的反馈!我也偶然发现了日志冲洗块。不幸的是,我仍然不确定如何设置自动刷新的新方式。我在哪里粘贴发行说明中提到的代码? f = File.open('foo.log', 'w'); f.sync = true; ActiveSupport::BufferedLogger.new f; 我尝试将其添加到 config/development.rb 并重新启动我的应用程序。创建了一个文件,但输出仍在发送到原始日志。
猜你喜欢
  • 2019-10-13
  • 2017-06-05
  • 1970-01-01
  • 2022-06-10
  • 2014-09-28
  • 2014-09-20
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多