我有一个 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
有关解决此问题的更好方法的任何意见?