【发布时间】:2013-05-10 14:04:02
【问题描述】:
我们在heroku cedar 中部署了一个grails 应用程序,我们的应用程序启动时间超过60 秒,根据heroku:
一个 Web 进程花费了超过 60 秒的时间来绑定到其分配的 $港口。发生这种情况时,测功机的进程被杀死,测功机 认为崩溃了
我们尽可能减少依赖,但在某些情况下启动时间超过 60 秒,因此我们的应用程序被 heroku 停止。
你知道避免这种情况的方法吗?
【问题讨论】:
我们在heroku cedar 中部署了一个grails 应用程序,我们的应用程序启动时间超过60 秒,根据heroku:
一个 Web 进程花费了超过 60 秒的时间来绑定到其分配的 $港口。发生这种情况时,测功机的进程被杀死,测功机 认为崩溃了
我们尽可能减少依赖,但在某些情况下启动时间超过 60 秒,因此我们的应用程序被 heroku 停止。
你知道避免这种情况的方法吗?
【问题讨论】:
我对这个问题有一个很好的解决方案:我分叉了 Grails buildpack 并添加了一些代码,强制 Jetty 提前绑定到$PORT,这样 Grails 就可以一直占用它想要启动的时间;在 Grails 启动期间,请求会因为 404 错误而失败,但至少应用程序可以可靠地启动。
https://github.com/funfork/heroku-buildpack-grails-earlybind
使用它:
heroku config:set BUILDPACK_URL=https://github.com/funfork/heroku-buildpack-grails-earlybind
如果您需要强制进行 slug 重新编译(确保您首先没有提交待处理):
git commit --allow-empty -m "empty commit"
git push heroku master
给你!
【讨论】:
你可以做两件事。第一个是尝试显式设置您的依赖项,以便依赖项解析不会花费那么长时间。见Pete's answer on slow Grails start-up。
您可以尝试的特定于 Heroku 的方法是使用新的 2X Dyno Size,它为您提供 1024MB 的 RAM 而不是 512MB(但请注意,它们是每小时 0.10 美元而不是 0.05 美元,并且不再属于免费层)。
最后,由于 Heroku 正在寻找与 $PORT 的绑定,您可以监听 $PORT 并将任何请求排队,直到应用程序完全启动。
【讨论】:
我在使用 Grail 的应用程序时也遇到了同样的情况。我的一个应用程序正确启动,但随后我部署了另一个应用程序并遇到了这个问题,尽管它们的依赖项配置非常相似。
我通过删除 BuildConfig.groovy 中的一些 js 插件(jquery、jquery-ui、twitter-bootstrap 和lesscss-resources)并手动添加这些资源来解决这个问题。
在本地,这或多或少地将启动时间从 20 秒减少到 13 秒(总是谈论第一次启动,在交互模式下连续启动非常快)。考虑到我还创建了删除表并引导了一些数据,尽管在我删除提到的插件之前避免这样做并没有解决我的问题。
有趣的是,我的另一个应用程序如何在 heroku 中及时启动,拥有所有插件。
【讨论】: