【问题标题】:Scala app exceeds Heroku memory quotaScala 应用程序超出 Heroku 内存配额
【发布时间】:2013-04-11 09:47:48
【问题描述】:

我在 Heroku 上托管我的移动应用程序的后端。它是用 Scala 编写的,使用 Scalatra 来公开 REST API。除此之外,我正在运行一个工作程序,它获取数据并将其推送到 MongoHQ 的数据库(使用 casbah)。对于他们两个,我不断收到 R14(超出内存配额) 错误。在我的本地机器上,worker 消耗的内存不超过 200 - 250 MB,根据 New Relic 监控,Scalatra 应用在 Heroku 上仅使用了 250 MB。

这些是我的 Heroku 实例上的相关环境变量:

JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -javaagent:newrelic/newrelic.jar

JAVA_TOOL_OPTIONS:-Djava.net.preferIPv4Stack=true

SBT_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops

回购:/app/.sbt_home/.ivy2/cache

Web 服务甚至还没有收到任何流量,那么 Heroku 为什么会抱怨内存消耗?

马可

【问题讨论】:

  • 你在使用 scalate 吗?

标签: scala heroku casbah scalatra


【解决方案1】:

作为一个实验,尝试将 Scalate 排除在等式之外。理论上,如果您在没有 Scalate 模板的情况下运行(此类应用程序不需要),您应该能够运行 Scalatra REST API 并在 JVM 中使用大约 64MB。

如果不深入了解您的部署,就很难确切知道。但作为一种猜测,现在默认捆绑到 Scalatra 的默认 G8 模板中以提供预编译视图以提高生产速度的 Scalate 编译器可能会让您超出 Heroku 的限制。

可能有一种方法可以让模板预编译在 Heroku 部署过程之外工作,但我对 Heroku 部署或 Scalate 模板编译不够熟悉,不知道它是如何工作的。如果您使用 WAR 进行部署,则模板已经被预编译,并且您不会在第一次启动时受到惩罚。

【讨论】:

  • 确实,我使用的是 Scalate!我删除了它,worker 和 web dyno 的内存占用减少了大约 200MB。不幸的是,他们每个人仍在使用大约 350MB 的内存:gist.github.com/mlamina/5363755
  • 本地运行web应用,只需要80MB左右的内存
  • 虽然在 Heroku 上托管了一个纯 Web 应用程序,但我的设置非常相似。我正在使用 Scalate 作为模板,也尝试了 New Relic。在本地测试设置(通过使用与 Heroku 上相同的参数的 target/start)我发现,New Relic 代理负责大部分内存开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2014-05-03
  • 2017-03-18
  • 2013-07-13
  • 2017-11-02
  • 2012-11-02
相关资源
最近更新 更多