我有一个简单的商业Rails 3.2.13应用程序,只有一个用户基础,具有非常小的Postgres DB表和非常简单的Active Record DB查询。我在两台dynos上运行,没有工人,在独角兽网络服务器上运行。在开发中,应用程序的根页面通常在150毫秒内加载,而在Heroku的生产中则在1秒内加载。
EXCEPT,当它随机超时时。我在日志中看到超时,但不是典型的R12请求超时。超时如下所示:
2013-05-28T16:04:28.004290+00:00 app[web.2]: Started GET "/" for 72.28.209.197 at 2013-05-28 16:04:28 +0000
2013-05-28T16:04:44.225643+00:00 app[web.2]: E, [2013-05-28T16:04:44.225444 #2] ERROR -- : worker=2 PID:87 timeout (16s > 15s), killing
2013-05-28T16:04:44.238422+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path=/ host=[REDACTED].herokuapp.com fwd="72.28.209.197" dyno=web.2 connect=7ms service=16240ms status=503 bytes=0
2013-05-28T16:04:44.255813+00:00 app[web.2]: E, [2013-05-28T16:04:44.255554 #2] ERROR -- : reaped #<Process::Status: pid 87 SIGKILL (signal 9)> worker=2
2013-05-28T16:04:44.298023+00:00 app[web.2]: I, [2013-05-28T16:04:44.297643 #103] INFO -- : worker=2 ready
当请求工作时,它看起来像这样:
2013-05-28T16:03:36.965507+00:00 app[web.1]: sequenceId="102642"] Started GET "/" for 72.28.209.197 at 2013-05-28 16:03:36 +0000
2013-05-28T16:03:37.388261+00:00 app[web.1]: sequenceId="102690"] Processing by OverviewController#index as HTML
2013-05-28T16:03:38.238877+00:00 app[web.1]: sequenceId="102707"] Rendered overview/index.html.erb within layouts/application (315.8ms)
2013-05-28T16:03:38.311974+00:00 app[web.1]: sequenceId="102710"] Completed 200 OK in 924ms (Views: 432.4ms | ActiveRecord: 92.1ms)
2013-05-28T16:03:38.322786+00:00 heroku[router]: at=info method=GET path=/ host=[REDACTED].herokuapp.com fwd="72.28.209.197" dyno=web.1 connect=2ms service=1375ms status=200 bytes=136795
2013-05-28T16:03:42.625787+00:00 app[web.1]: sequenceId="102940"] Started GET "/assets/favicon.ico" for 72.28.209.197 at 2013-05-28 16:03:42 +0000
2013-05-28T16:03:58.753408+00:00 app[web.1]: sequenceId="104359"] E, [2013-05-28T16:03:58.753173 #2] ERROR -- : worker=2 PID:66 timeout (16s > 15s), killing
2013-05-28T16:03:58.801152+00:00 app[web.1]: sequenceId="104362"] E, [2013-05-28T16:03:58.800993 #2] ERROR -- : reaped #<Process::Status: pid 66 SIGKILL (signal 9)> worker=2
2013-05-28T16:03:58.798722+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path=/assets/favicon.ico host=[REDACTED].herokuapp.com fwd="72.28.209.197" dyno=web.1 connect=3ms service=16175ms status=503 bytes=0
2013-05-28T16:03:59.127150+00:00 app[web.1]: sequenceId="104397"] I, [2013-05-28T16:03:59.126795 #84] INFO -- : worker=2 ready
注意事项:请求响应时间为924 ms。但是之后发生了一些奇怪的错误。
这是该请求在DB查询方面的样子。这里没有任何令人兴奋的事情发生,而且这些DB表只包含几百行数据。没有理由说响应有时需要1秒,有时需要15秒以上。下面是这个极其简单的控制器动作的代码:
class OverviewController < ApplicationController
def index
@current_event = Event.recent
@areas = Area.order(:position)
@reservations = Reservation.find(:all,
:conditions => { :event_id => @current_event.id },
:order => 'created_at DESC',
:limit => 5)
end
end
下面是event# recent方法,这样你就可以看到它没有做任何可能需要15秒以上的事情:
def self.recent
Event.last || Event.create
end
我不知道如何让这个应用程序稳定,除了把它从Heroku移开。我不知道有什么办法能解决这个问题,我想Heroku也帮不了我。我只是卡住了吗?除了将应用程序移到引擎场之外,我还有其他解决问题的方法吗?
这里没有任何帮助,这个网站是Heroku的技术支持。每月支付35美元并不能给我买到任何支持,所以我被困住了,Heroku没有任何发展的道路。
所以我对这个问题的回答是将应用程序移到Engine Yard。我看不出我还有别的选择。当Heroku工作时,它是很棒的,当它不工作时,它是一个完全的谜,没有技术支持。