找到Ruby on Rails内存泄漏的任何好方法吗?

时间:2019-06-20 11:45:22

标签: ruby-on-rails ruby memory-leaks

我的项目遇到内存泄漏,在部署后,它的内存在10分钟内从500 MB增加到1800 MB。

我尝试了许多工具,但是没有一个易于使用。

我用过JProfiler,它显示了调用栈,内存分配,哪些类/方法被称为太多……以图表的形式,非常易于阅读和分析。我真的很喜欢

像这样: enter image description here

并这样:

enter image description here

我已经找到了此工具:https://github.com/tenderlove/heap-analyzer,但是我没有使用过。

那么,有什么好的方法/工具来查找ruby / rails内存泄漏吗?

我尝试了mini_profiler,但无法正常工作。

非常感谢!

3 个答案:

答案 0 :(得分:5)

您还可以尝试使用这些工具来广泛地分析应用程序。

您还需要专注于 GC jemalloc 内存管理。

答案 1 :(得分:3)

技术就像:

  1. 为自己制作一个最小的可重复示例,该示例发生泄漏,因此您可以在开发机器上进行复制(以下步骤也适用于生产,但不建议这样做)。

    泄漏可能不会很大,您只需要确定它正在发生即可。服务器也必须在单个进程模式下运行(否则,您可能会从可能尚未泄漏的其他进程中无用地转储。)

  2. 创建一个特殊动作(类似于l1 = [cat_A, cat_B, cat_C, cat_D], l2= [dog_A, dog_B, dog_C, dog_D]),
GET /do_dump

请注意,这是一项繁重的操作,会产生巨大的文件

  1. 将执行require 'objspace' ObjectSpace.dump_all(output: File.open('dump.json', 'w')) 次的操作
  2. 触发泄漏,然后使用GC方法并稍等
  3. 从步骤2开始执行转储
  4. 使用您提到的或手动进行的堆分析器之类的工具对其进行分析,目的是找到悬空的对象及其到根的路径。

几年前,我通过为红宝石1.9.2编写heap_dump宝石(实际上与GC.start非常相似)解决了类似的问题,它与现代红宝石不兼容,但具有通用提示自述文件中的所有内容均适用。

此外,内存碎片可能存在问题,您可以尝试使用由ObjectSpace.dump_all构建的ruby。但是通常这些仅在更长的运行时间后才会显示

PS。以防万一-确保您的代码中没有jemalloc

答案 2 :(得分:2)

我还没有看到这些作为回应:

详细here中提供了用法详细信息以及一些建议的解决方案(jemalloc)