为啥我的基本 Heroku 应用程序需要两秒钟才能加载?

Posted

技术标签:

【中文标题】为啥我的基本 Heroku 应用程序需要两秒钟才能加载?【英文标题】:Why are my basic Heroku apps taking two seconds to load?为什么我的基本 Heroku 应用程序需要两秒钟才能加载? 【发布时间】:2011-02-06 01:32:57 【问题描述】:

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

Cropify - 基本 Sinatra 应用程序 (on github) Textile2html - 更基本的 Sinatra 应用程序 (on github)

我所做的只是创建一个简单的 Sinatra 应用程序并进行部署。我没有做任何事情来弄乱或测试 Heroku 服务器。我可以做些什么来缩短响应时间?现在很慢,我不知道从哪里开始。如果有帮助,项目的代码在 github 上。

【问题讨论】:

两秒?对你有好处,我的需要 30 秒。 【参考方案1】: 如果您的应用程序有一段时间未使用,它将被卸载(从服务器内存中)。 在第一次点击时,它会被加载并保持加载,直到一段时间过去而没有人访问它。

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

关于这个有一个official note。

【讨论】:

解决此问题的最简单方法是将测功机增加到 2。 ping 你的服务器以防止它闲置是在你自己的窝里胡扯。您所说的这些服务是免费的。他们需要节约资源。如果每个人都对他们的服务器执行 ping 操作,则没有一个被换出,并且提供商必须扩大规模。那要花钱……再见免费服务。我认为这个答案的发布者应该删除 ping 服务器的建议。 我使用 uptimerobot.com 每 5 分钟免费 ping 我的 Heroku 应用程序 - 它告诉我我有 200OK(更重要的是当我没有时)并且它保持应用程序响应。我对此不道歉;我有 10 个 heroku 应用程序,其中大部分是开发或演示应用程序,但特别是这个是实时/生产的,尽管流量很低,但它需要在请求时快速响应。如果这对 Heroku 的商业模式构成威胁,那么他们会阻止我们这样做。当我拥有成千上万的全球用户时,我将启动另一个 dyno 并开始为优质服务付费。所以放弃内疚之旅吧! :) 我支持 Tokn。如果网站加载速度太慢以至于在网站启动之前就离开了,那么新应用应该如何吸引用户? 现在回想起来,确实做到了。幸运的是 Heroku 处理得很好。您不能再永久拥有免费的测功机,因为免费套餐现在受到正常运行时间的限制。【参考方案2】:

您可能还想研究 Heroku w/ Varnish 和 Memcached 上的缓存选项。这些都是独立于测功机的。

例如,如果您有一个不变的主页,您可以通过在响应中添加 Cache-Control 标头在 Varnish 中将其缓存很长时间。那么你的用户直到他们想要“做某事”而不是他们到达时才会体验到负载。

【讨论】:

【参考方案3】:

我也有同样的问题。我昨晚部署了一个 Rails 3 (1.9.2) 应用程序,速度很慢。我知道 1.9.2/Rails 3 在 Heroku 上处于 BETA 阶段,但支持票说使用他们发给我的一些说明应该没问题。

我了解长时间后的第一个请求需要的时间最长。说得通。但是,仅仅加载甚至不连接到数据库的页面有时需要 10 秒是非常糟糕的。

不管怎样,你可能想试试我要做什么。那是配置我的应用程序,看看在本地需要多长时间。如果它需要 400 毫秒,那么就出了问题。但是,如果我在本地获得 50 毫秒,而在 Heroku 上仍然需要 10 秒,那么肯定有问题。

很明显,缓存会有所帮助,但您只能免费获得 5MB,而且再一次,只有一个人使用该网站,它不应该那么慢。

【讨论】:

【参考方案4】:

您应该查看 Tom Robinson 对“可扩展性:Heroku 如何工作?”的回答。知乎上:http://www.quora.com/Scalability/How-does-Heroku-work

Heroku 将服务器资源分配给许多不同的客户/应用程序。您的应用程序分配有计算能力块。 Heroku 根据资源需求进行分区。当您有一个需要更多功能的流行应用程序时,您可以为更多的“dynos”(应用程序容器)付费,然后获得更大的份额作为回报。

但在您的情况下,您正在运行一个免费应用程序,很少有人(如果您以外的人)访问/使用。因此,Heroku 通过卸载您的应用程序(本质上将其置于休眠状态)来减少您获得的资源,直到您的地址收到请求。当这种情况发生时,并且您的应用已经闲置了很长时间,重新加载需要一些时间。

如果重新加载时间很重要,请添加 1 个额外的测功机以防止您的应用进入睡眠状态。

【讨论】:

【参考方案5】:

我通过 heroku 的免费帐户安装的每个应用程序都遇到了同样的问题。现在有添加 dynos 的选项,这样您的应用程序在一段时间内不使用时不会被卸载,您也可以尝试使用 redis 或 memcached 进行缓存。但是我为我的小规模项目使用了一个 hacky 解决方案,我基本上构建了网络爬虫,将它放在一个无限循环中,并带有 sleep 和 tada 网站实际上有更好的响应时间(我猜它没有因为脚本而被卸载)。

【讨论】:

以上是关于为啥我的基本 Heroku 应用程序需要两秒钟才能加载?的主要内容,如果未能解决你的问题,请参考以下文章

按钮需要单击两次才能工作 - 为啥?

为啥我需要在提交按钮上单击两次才能提交我的表单?

一秒钟后反应组件在heroku上消失

UIAlert 需要几秒钟才能显示

为啥我必须执行两次按钮功能才能使我的逻辑正常工作?

为啥我的应用无法在 Heroku 上建立 websocket 连接?