Heroku慢慢加载

时间:2013-08-29 22:51:13

标签: ruby-on-rails ruby postgresql heroku

我的Heroku Rails总是非常缓慢地加载,而不仅仅是在第一次启动时。

它在生产模式下不会缓慢加载。

我有New-Relic Installed,我有两个Dynos正在运行,我有PostgreSQL Crane Plan。但是当我启动我的应用程序时,它通常需要大约30秒才能加载,而60%的时间它会直接进入Application Error,如果我检查我的日志,我会得到Memory Quota Exceeded。即使我进入一个静态页面,其源代码中没有Ruby,它仍然会缓慢加载。有时我设法连接到我的应用程序,从页面到页面导航时通常需要大约10秒钟才能加载。 我一直在网上寻找年龄,我找到的所有最常见的答案只是添加一个额外的dyno,但这没有帮助。

我也在Unicorn上运行

这些是电影#show页面中的日志,首先加载然后崩溃

Started GET "/movies/61708" for 81.34.154.155 at 2013-08-29 23:08:23 +0000
2013-08-29T23:08:30.093034+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/?page=7 host=www.websitename.com fwd="81.34.154.155" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0
2013-08-29T23:08:31Z app[postgres.8916]: [BLUE] duration: 6945.946 ms  statement: SELECT "movies".* FROM "movies" 
2013-08-29T23:08:41+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_BLUE measure.current_transaction=2844 measure.db_size=60732536bytes measure.tables=23 measure.active-connections=10 measure.waiting-connections=0 measure.index-cache-hit-rate=1 measure.table-cache-hit-rate=1
2013-08-29T23:08:45.401673+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/movies/63724 host=www.websitename.com fwd="81.34.154.155" dyno=web.1 connect=2ms service=30001ms status=503 bytes=0
2013-08-29T23:08:45.445116+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/movies/63704 host=www.websitename.com fwd="81.34.154.155" dyno=web.2 connect=3ms service=30000ms status=503 bytes=0
2013-08-29T23:08:52.684401+00:00 heroku[web.2]: Process running mem=512M(100.0%)
2013-08-29T23:08:52.684613+00:00 heroku[web.2]: Error R14 (Memory quota exceeded)
2013-08-29T23:08:53.647059+00:00 app[web.1]: E, [2013-08-29T23:08:53.384868 #2] ERROR -- : worker=0 PID:5 timeout (61s > 60s), killing
2013-08-29T23:08:54.375154+00:00 app[web.1]: E, [2013-08-29T23:08:54.374971 #2] ERROR -- : reaped #<Process::Status: pid 5 SIGKILL (signal 9)> worker=0

有没有人知道这方面的解决方案?

1 个答案:

答案 0 :(得分:1)

您在评论中提到60,000表中有movies行。从您的日志中可以看出您正在执行以下操作:

Movie.all

这将生成一个类似我们在日志中看到的SQL查询。

SELECT "movies".* FROM "movies"

Postgres的内存/存储容量与您的问题无关。您的数据库可能位于具有96G RAM的专用服务器上。 Heroku最终会遇到同样的问题。

当您执行Movie.all之类的操作时,您将为所有Movie记录创建60,000的内存中ruby类实例。这需要时间和空间。

您可能也会将这些记录的(我敢说所有?!)过多地渲染到一个网页上。无论您是否使用Heroku,这只是方式在单个请求中呈现的数据太多。

Heroku对请求的运行时间有30秒的严格时间限制。你达到了这个极限。尝试较小的数据子集,即使只是作为测试,看看它是否能解决您的问题。我打赌它会。

Movie.limit(10)