为什么我的基本Heroku应用需要两秒钟才能加载?

118

我创建了两个非常简单的Heroku应用程序来测试该服务,但是当我第一次访问它们时,加载页面通常需要几秒钟:

我只是创建了一个简单的Sinatra应用程序并部署它。我没有对Heroku服务器进行任何干扰或测试。我该怎么做才能改善响应时间?现在速度非常慢,我不知道从哪里开始。如果有帮助,这些项目的代码都在github上。


两秒钟?你很快啊,我的需要30秒。 - Robo Robok
5个回答

203
  • 如果您的应用程序一段时间没有被使用,它将从服务器内存中卸载。
  • 在第一次访问时,它会被加载并保持加载状态,直到一段时间没有任何人访问它。

这是为了节省服务器资源。如果没有人使用您的应用程序,为什么要保留资源并不允许真正需要它们的人使用呢?
如果您的应用程序具有大量持续的流量,它将永远不会被卸载。

官方说明在此


55
最简单的方法是将您的dynos增加到2个。 - Chap
79
让服务器保持运行状态的ping操作就像是在自己的巢穴里拉屎一样不好。你所谈论的这些服务是“免费”的,因此它们需要节约资源。如果每个人都对其服务器进行ping操作,那么服务器就没有机会被替换掉,提供者就必须扩大规模,这将造成成本支出……免费服务就会消失。我认为回答者应该删除关于对服务器进行ping操作的建议。 - GreenAsJade
43
我使用uptimerobot.com每5分钟免费对我的Heroku应用程序进行ping,它会告诉我是否有200OK(以及更重要的是当它没有响应时),并保持应用程序的响应性。我对此毫不抱歉;我有10个Heroku应用程序,其中大部分都是开发或演示应用程序,但这一个特别是实时/生产环境,尽管流量较低,但需要在被请求时快速响应。如果这对Heroku的商业模式构成威胁,他们会阻止我们这么做的。当我拥有数千个全球用户时,我将启动另一个dyno并开始为这项优秀的服务付费。所以别再让我感到内疚了! :) - ED-209
5
我支持Tokn。如果网站加载太慢以至于用户在页面打开之前就离开了,那么新的应用程序如何吸引用户呢?请问需要怎样的翻译? - Deborah
4
回顾现在,巢穴撒鸟粪确实已经实现了。幸运的是 Heroku 处理得很好。现在你不能再永久免费地使用 dyno,因为免费套餐现在有最长运行时间限制。 - Jenny Shoars
显示剩余8条评论

16
你可能还想调查在Heroku上使用Varnish和Memcached缓存选项。这些选项是与dynos独立持久的。
例如,如果你有一个不变的主页,可以通过向响应添加Cache-Control标头,在Varnish中将其缓存一段时间。然后你的用户在到达时不会遇到负载压力,直到他们想要“做某事”。

6
您应该查看Tom Robinson在Quora上回答“可扩展性:Heroku是如何工作的?”的答案:http://www.quora.com/Scalability/How-does-Heroku-work Heroku将服务器资源分配给许多不同的客户和应用程序。您的应用程序被分配了计算力块。Heroku基于资源需求进行分区。当您拥有一个需要更多计算能力的受欢迎应用程序时,您可以支付更多的“动态”(应用程序容器),然后获得更大的收益。
然而,在您的情况下,您运行的是很少有人访问或使用的免费应用程序。因此,Heroku会减少您得到的资源,并卸载您的应用程序-实质上将其置于休眠状态,直到有请求发送到您的地址。当发生这种情况并且您的应用程序已经空闲了很长时间时,重新加载需要时间。
如果这个重新加载时间很重要,您可以添加1个额外的“动态”以防止您的应用程序睡眠。

3
我正在遇到同样的问题。我昨晚部署了一个Rails 3(1.9.2)应用程序,但速度很慢。我知道在Heroku上,1.9.2 / Rails 3处于BETA版本,但支持人员说按照他们发送给我的一些说明应该没问题。
我知道,长时间没有请求后的第一个请求需要最长时间,这很有道理。但是,仅加载不连接到DB的页面有时需要10秒钟,这非常糟糕。
无论如何,你可能想尝试我即将要做的事情。也就是分析我的应用程序并查看本地花费的时间。如果需要400ms,那么肯定出了问题。但是,如果本地只需要50ms,而在Heroku上仍然需要10秒钟,那么肯定出了问题。
显然,缓存是有帮助的,但你只能免费获得5MB,而且再次强调,有一个人使用该网站,不应该如此缓慢。

0

我在通过Heroku的免费账户安装每个应用程序时都遇到了同样的问题。现在有添加dynos的选项,这样您的应用程序在暂时不使用时不会被卸载,您还可以尝试使用Redis或Memcached进行缓存。但是对于我的小型项目,我使用了一个hacky解决方案,我基本上构建了一个Web爬虫并将其放入无限循环中,然后睡眠,网站实际上具有更好的响应时间(我猜这是因为脚本没有被卸载)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接