Resque worker 日志记录会减慢 Rails 的响应速度



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

感觉确实像我做错了什么,或者没有遵循"轨道方式"。 建议?

这是我的 Resque 作业中的代码,它执行选择/插入

# 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

软件堆栈

  • 导轨 3.2.0
  • PostgreSQL 9.1
  • 雷斯克 1.20.0

编辑

我终于花时间对此进行了更多的调试。即使是非常简单的工作线程,如下所示,也会减慢下一个服务器响应的速度。在我启动轨道切断进程的控制台中,我看到只有在我 ping 服务器后才会打印来自工人的延迟 b/c 标准输出。

  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

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

我认为这个对"Resque的日志记录问题"的回答会有所帮助。

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

注意:这已经发生在我身上一段时间了,但我最近才把手指放在上面。

最新更新