【问题标题】:Heroku Application Error - Memory quota exceeded on deploy - Scout shows 4,804,423 allocationsHeroku 应用程序错误 - 部署时超出内存配额 - Scout 显示 4,804,423 个分配
【发布时间】:2018-07-04 01:50:46
【问题描述】:

我正在尝试在 Heroku 上的 Rails 应用程序中查找内存膨胀问题。

我已经阅读了大量关于内存膨胀的文章,并尝试使用Scout 来诊断问题。

我正在关注Christoffers question 关于 Heroku 内存上升的信息,但我有一个不同的问题。我的几乎总是在部署之后,然后内存使用量上升,我的应用程序中断。

以下是 Heroku Metrics 中的一个示例:

如您所见,部署完成,然后在第一次访问应用程序中断之后。

我已经对我能做的事情进行了基准测试(检查了我的查询),但在开发过程中并没有出现任何缓慢的迹象。此外,它似乎不是一个控制器,它只是 在部署后使用的第一个控制器 坏了。我试了几个,第一次加载的时候都坏了。

Scout Dashboard - Memory Allocation Breakdown 将其显示为 CategoriesController 的超时请求示例:

partial 和 layout 正在渲染,因为它应该在图像下


系统

我正在运行 Rails 5.1.4,为 Angular 2 安装和配置了 Webpacker。 这意味着我已经在我的根目录中添加了一个 Procfile:

web: bundle exec puma -p $PORT 这是Heroku documentation推荐的

应用正在按应有的方式部署,但出现关于 ... has incorrect peer dependency ... 的小错误


健康和生病日志

我试图找到一个健康的 Heroku 日志和一个生病的 Heroku 日志

如果对此感兴趣,请提出要求。


工人人数

我已阅读文章 Ruby Memory Use 并尝试将我的 config/puma.rb 中的工人数量减少到 1,但没有结果。



更新!

1 . Heroku 上内存使用的奇怪行为:

它在每天重新启动后大约 100 MB 后开始,但在超时(第一次访问)后,内存使用量跃升到略低于 500 MB。

  1. @grizzthedj 提到了公共文件夹。它是 27.1 MB,因为 PDF.js 插件很重。

我正在寻求帮助来定位此问题。这可能是什么?你有什么想法吗 - 让我试试吧!

我已经尝试了我认为可行的方法,但没有任何帮助。

任何帮助将不胜感激。

你可以在我的Github page找到该应用

【问题讨论】:

  • 目前平均有多少用户登录到您的应用?您如何将您的应用程序部署到 Heroku(即什么框架)? /public 目录中的所有资产是否在初始页面加载时下载?您是否在 /public 目录中的资产上使用缓存破坏器?
  • 嘿@grizzthedj - 我正在使用 Ruby on Rails 和 Webpacker。 公用文件夹 - 是的 - 我根本没有考虑过公用文件夹。 没有缓存破坏器。会是这样吗?我使用了一个很重的pdf.js 插件。
  • 我已经更新了我的帖子。

标签: ruby-on-rails heroku memory-management webpack


【解决方案1】:

这里可能有几种可能性。

首先,我怀疑您的 webpacker 构建管道可能存在问题。

在您的帖子中,您提到您的 pdf.js 在部署时为 27.1 MB。当我从网站下载该文件时,它只有 ~514 KB。

我不知道你的 webpacker 构建任务在做什么,但我怀疑它可能会无意中修改这个文件(也许通过一些通配符规则)。

其次,在您的 /public/packs/ 目录中还有 3 个其他 .js 文件,每个文件大小超过 7 MB。仅.js 就将近 50 MB!您的公用文件夹中还有重复的pdf.js 文件:

/public/pdfjs/build/pdf.js
/public/pdf_categories/build/pdf.js 

很难说这些是否是唯一的问题,但对于初学者,我会做以下事情(如果你还没有这样做的话):

  1. 再次检查您的 webpacker 是否没有向您的 pdf.js
  2. 使用 webpacker 压缩你的 .js.css 文件
  3. 确保您对所有静态资产使用gzip compression

【讨论】:

  • 非常感谢@grizztjhedj - 我会尝试这三件事并回复你!
【解决方案2】:

所以...我想分享一些东西:

我有另一个应用程序 - 一个旧应用程序 - 在部署时遇到了同样的问题。 每次部署后,应用程序都会中断 - 超出内存配额 - 一段时间后它会重新启动并运行。

在 Heroku Logs 中说,在报错之前:

[Webpacker] Compiling…



我从Github Issue 发现我的config/webpacker.yml 与他们的略有不同。

webpacker.yml的底部有生产和挖矿的设置:

compiling: true

这意味着

在第一次使用 webpacker 文件加载页面时,例如 rails 中的 javascript_pack_tack,编译将开始,即使 Webpacker 已经在部署时编译了文件

您可以看到它在部署到 Heroku 时完成 - 在 assets:precompile: 之后:

remote:        Running: rake assets:precompile
...
Done in 24.02s.
remote:        Webpacker is installed ? ?
remote:        Using /tmp/build_../config/webpacker.yml file for setting up webpack paths
remote:        Compiling…

我的应用没有使用部署中的编译文件 - 所以错误是我编译了两次!!。而关于 Heroku 的一个爱好计划的记忆对于第二个来说是不够的。

当我将设置更改为:

compile: false

一切正常!

我希望它会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2012-12-21
    • 2019-08-23
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多