我有一个Resque作业,它从远程服务器中提取csv数据列表,然后运行+ 40k条目以将任何新项目添加到现有数据库表。作业运行正常但是它严重减慢了对服务器的任何后续请求的响应时间。在我推出的“捆绑exec rails服务器”的控制台中,虽然作业正在运行但我看不到打印语句。然而,一旦我点击我的rails服务器(通过页面引用),我看到在服务器响应之前滚动了多个SELECT / INSERT语句。 SELECT / INSERT语句显然由我的Resque作业生成,但奇怪的是他们等待打印到控制台单元我通过浏览器命中服务器。
确实感觉我做错了什么或不遵循'rails way'。建议?
以下是我的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
软件堆栈
修改
我终于花时间调试了这一点。即使是非常简单的工作者,如下所示,也会减慢下一个服务器响应速度。在我启动了铁路服务器进程的控制台中,我看到只有在我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
有关解决此问题的更好方法的任何输入吗?
答案 0 :(得分:0)
我认为this answer to "Logging issues with Resque"会有所帮助。
在开发模式下,Rails服务器打开了日志文件。我的理解 - 我需要确认这一点 - 它是在写入任何新内容之前刷新日志,以便保留顺序。如果您将Rails服务器连接到终端,它希望首先输出所有更改!如果您的工作人员已将大量数据写入日志,这可能会导致大量延迟。
注意:这已经发生在我身上已有一段时间了,但我最近只是把它放在了它上面。