使用 BleakHouse 发现 Rails 应用的内存泄漏

  • Sebastien Auvray
  • Jerom Wang

2007 年 5 月 15 日

话题:RubyRuby on Rails语言 & 开发

尽管 Rails 的敏捷性从来没有人质疑过,但它的性能却常常是人们争论的热点。

DTrace 是由Twitter 团队近期提供的一个很好用的分析应用程序行为的动态框架。另外,Evan Weaver 开发了一个新的工具,Rails 的插件 BleakHouse,用来处理内存问题。像 Ruby 这样的动态语言所具备的优势之一就是其内省(Introspect)的能力:在应用程序的内部就可以检查你应用程序的状态,但是大家在使用 ObjectSpace(Ruby 被垃圾收集的对象堆探测器)时应当多加留心。诚然,BleakHouse 在最初的版本使用了 ObjectSpace 对 Rails 应用进行快照,但 Evan Weaver 发现 ObjectSpace 并不是量子化的:使用 ObjectSpace 将会改变它自己的状态。

目前,BleakHouse 使用的是一个无泄漏的 C 语言实现,直接使用堆,其优势是目前可以直接根据实际内存使用量画出图表(交换内存、实际内存和组合内存),并且比以前运行得更快。

它可以按控制器、Action 和类来生成参考图表。

BleakHouse 要用到 gruff(因此也要用到 rmagick)。由于它是用 C 语言实现的,它还需要一个打了补丁的 Ruby 二进制文件来监视应用程序。一旦插件安装完成并且环境被设置为产品环境(Production)时,你就可以跟踪你的应用了。最后,你可以通过运行 rake 来生成这些图表。

BleakHouse 向 InfoQ 提醒到Charles Nutter 关于使 Ruby 更为好用的第五条建议:把 ObjectSpace 丢在一边,尤其是当人们最终必须通过对 VM 打补丁的方式来进行监视的时候:

由于限制了 Ruby 的垃圾回收机制和线程子系统,ObjectSpace 给 Ruby 带来损害,因此应当弃之不用。

Java 有不少高效的堆分析工具,你可能会想,用于 Ruby 的 RProbe 和 RProfiler 在哪儿呢?我认为,随着时间的增长,新的 VM 被引入,并且更多的公司参与进来,这样的工具最终会出现在人们面前的……

查看英文原文:Find Memory Leaks in Your Rails Application with BleakHouse

RubyRuby on Rails语言 & 开发