我最近推出了一个新的 Ruby on Rails 应用程序,它在开发模式下运行良好。启动后我一直在体验正在使用的内存不断增加:
更新:当这个屏幕转储(下一个)来自 New Relic 时。我已经安排了每小时重新启动一次网络测功机(两个网络测功机中的一个)。因此,它没有达到 500Mb 的崩溃级别,实际上它有点像锯齿状图案。这个问题根本没有解决,只是一些症状。如您所见,早上并不那么忙,但下午更忙。我在 11.30 上传了一个小细节,即使它出现在统计数据中,它也不会影响问题。
还可以注意到,即使图表显示 AVG 内存,MIN 内存仍在不断增加。即使图表似乎在图表中暂时下降,最小内存保持不变或增加。MIN 内存永远不会减少!
该应用程序将(无需重新启动测功机)增加内存,直到达到 Heroku 的最大级别,并且应用程序因执行过期类型的错误而崩溃。
我不是一个优秀的程序员,但我之前做过一些应用程序,没有遇到过这类问题。
已执行故障排除
A. 我认为问题出在 application_controller 中的 before_filter 中(应用程序控制器中的变量会导致 Rails 中的内存泄漏吗?)但这不是问题。
B. 我安装了 oink 但它没有给出任何结果(根本)。它会创建一个 oink.log,但在我运行“heroku run oink -m log/oink.log”时不会给出任何结果,无论阈值是多少。
C. 我试过 bleak_house 但它已被弃用并且无法安装
D. 我在谷歌上搜索并阅读了该主题的大多数文章,但我并不聪明。
E. 我很想测试 memprof 但我无法安装它(我有 Ruby 1.9x 并且不知道如何将它降级到 1.8x)
我的问题:
Q1。我真正想知道的是每个请求都在增加的变量的名称,或者至少哪个控制器使用的内存最多。
Q2。下面代码中的控制器会增加内存吗?
related_feed_categories = []
@gift.tags.each do |tag|
tag.category_connections.each do |cc|
related_feed_categories << cc.category_from_feed
end
end
(对不起,由于某种原因,SO不会重新格式化代码以使其易于阅读)。
之后我是否需要用“related_feed_categories = nil”“杀死”related_feed_categories 或者垃圾收集器会处理这个问题?
Q3。我要寻找的主要内容是什么?现在我根本无法缩小范围。我不知道要深入研究代码的哪一部分,也不知道要查找什么。
Q4。万一我真的解决不了问题。是否有任何在线咨询服务可以发送我的代码并让他们找到问题?
谢谢!
更新。收到评论后,它可能与会话有关。这是我猜可能不好的代码的一部分:
# Create sessions for last generation
friend_data_arr = [@generator.age, @generator.price_low, @generator.price_high]
friend_positive_tags_arr = []
friend_negative_tags_arr = []
friend_positive_tags_arr << @positive_tags
friend_negative_tags_arr << @negative_tags
session["last_generator"] = [friend_data_arr, friend_positive_tags_arr, friend_negative_tags_arr]
# Clean variables
friend_data_arr = nil
friend_positive_tags_arr = nil
friend_negative_tags_arr = nil
它用于 generator#show 控制器。当通过我的礼物生成引擎生成了一些礼物时,我将输入保存在会话中(以防他们想在以后使用该信息)。我从不杀死或过期这些会话,以防万一这可能导致内存增加。
再次更新:我删除了这段代码,但内存仍然增加,所以我猜这部分不是它,但类似的代码可能会导致错误?