1

我有一个 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

软件堆栈

  • 导轨 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 时抑制标准输出,我可以让 rails 服务器再次恢复正常响应,但似乎没有必要这样做......bundle exec rails server > /dev/nul

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

4

1 回答 1

0

我认为这个对“使用 Resque 记录问题”的回答会有所帮助。

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

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

于 2012-08-14T23:35:16.927 回答