Rails 3.2 -> 4.2 紧急升级,Heroku 内存泄漏

问题描述 投票:0回答:1

随着 5 月 1 日 Heroku-18 堆栈的弃用,我需要将一个非常旧的 Rails 应用程序更新到所需的最低版本。虽然是这样,但我成功了。

我有一个全新的版本即将部署基于rails 6,但目前,我需要运行这个旧应用程序。我注意到内存占用几乎翻了一番(在 3.2 上,平均为 512mb ram 的 90-120%),我的直接权宜解决方案是将测功机更新为

2x 1gb ram
,但是,我想查明问题所在。

2023-05-01T17:46:12.209506+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:46:12.211046+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2023-05-01T17:46:33.107262+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:46:33.111875+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2023-05-01T17:46:54.224029+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:46:54.227886+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2023-05-01T17:47:15.327098+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:47:15.328612+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2023-05-01T17:47:36.150757+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:47:36.152131+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2023-05-01T17:47:57.287322+00:00 heroku[web.1]: Process running mem=990M(188.0%)
2023-05-01T17:47:57.289241+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)

旧应用程序使用memcachd,新应用程序使用内存缓存,这肯定是问题之一。我可以切换到基于文件的缓存吗?我应该考虑 Redis 缓存还是其他我没有考虑过的解决方案?

这个应用程序也使用 Unicorn,我所有的新应用程序都使用 Puma。这值得研究吗?

performance ruby-on-rails-3 heroku ruby-on-rails-4 memory-leaks
1个回答
0
投票

这是一个老问题,但可能仍会让新用户暂时受益。

这里有两个解决方案:

  1. 改用 jemalloc 来分配内存,这对于旧版本的 Rails 来说是惊人的。基本上,它会让你的记忆力随着时间的推移而下降,而不是总是上升,你可以阅读文档等了解更多信息。我最近用它得到了一个应用程序,需要四个 50 美元/月的测功机,而只需要一个爱好测功机。只需将构建包添加到 heroku 即可处理此问题,无需更改代码。 https://prathamesh.tech/2021/05/23/adding-jemalloc-to-rails-apps-on-heroku/
  2. 要部署rails应用程序,它需要在heroku-20上运行(最新的)ruby 2.7.X。我已经成功使用 2.7.8 来命名特定版本。当然,您可能拥有与该版本不兼容的 gem。

但是,需要注意的是,在heroku-20不再可用(2025年4月)之后,我认为Rails 4.2仍然无法部署在heroku上。 https://devcenter.heroku.com/articles/heroku-20-stack

© www.soinside.com 2019 - 2024. All rights reserved.