轨道上的ruby/ruby内存泄漏检测

我在rails上使用ruby编写了一个小型web应用程序,其主要目的是上传,存储和显示来自xml(文件可以高达几MB)文件的结果。 运行了大约2个月后,我注意到这个杂种进程使用了​​大约4GB的内存。 我做了一些关于debuggingruby内存泄漏的研究,但是找不到太多内容。 所以我有两个问题。

  • 有什么好的工具可以用来在Ruby / rails中查找内存泄漏?
  • 什么types的编码模式导致ruby中的内存泄漏?

在Rails中查找内存泄漏的一些提示:

  • 使用Bleak House插件
  • 实现侦察监视专门的内存使用情况分析器
  • 实施FiveRuns监测
  • 尝试另一个简单的内存使用logging器

首先是ObjectSpace中对象的内存使用情况的graphics化探索。

最后两个将帮助您确定使用内存的使用模式,并且您可以从那里开始工作。

至于具体的编码模式,从经验看,你必须观看任何处理文件IO,image processing,使用大量string等。

我会检查你是否使用最合适的XML库 – ReXML被认为是缓慢的,并认为是泄漏(我没有证据!)。 另外检查你是否可以记住昂贵的操作。

在每个请求之后或之前logging内存使用情况的超级简单方法(仅适用于Linux)。

#Put this in applictation_controller.rb before_filter :log_ram # or use after_filter def log_ram logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip end 

您可能需要加载脚本/控制台,然后先尝试一下声明,以确保它在您的盒子上正常工作。

 puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip 

然后只监视顶部,当一个请求使你的内存使用跳转,去检查日志。 当然,这只会帮助你有一个内存泄漏发生在大跳跃,而不是微小的增量。

内存泄露是目前ruby实现中的一个问题,这是一个很好的起点,这是http://whytheluckystiff.net/articles/theFullyUpturnedBin.html为什么网站不存在了,但你可以在这里find原始的文章: http:/ / /viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

有关长时间运行ruby进程的问题的更具体的答案请参阅http://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

也许你可以给乘客(mod_rails)一试http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

你应该看看ruby教授 。

切换到jruby并使用Eclipse Memory Analyzer 。 目前还没有类似Ruby的工具。

现在,您可以运行以下命令以R可以读取的格式获取内存。 我假设你的日志行如下所示:

 1234567890 RAM USAGE: 27456K 

运行(或修改为套件):

 $ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log 

然后你可以运行这个:

 #!/bin/sh rm -f mem.png R --vanilla --no-save --slave <<RSCRIPT lst <- read.table("mem.log") attach(lst) m = memory / 1024.0 summary(m) png(filename="mem.png", width=1024) plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory") RSCRIPT 

并得到一个不错的图表。

这些gem为我工作:

MemoryLogic

在rails日志中添加proccess id和内存使用情况,非常适合追踪内存泄漏

loggingparsing器以识别显着增加VM堆大小的操作