ruby / ruby​​ on rails内存泄漏检测

时间:2008-10-02 08:15:28

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

我在rails上使用ruby编写了一个小型Web应用程序,其主要目的是上传,存储和显示xml(文件最多可达几MB)文件的结果。运行了大约2个月后,我注意到mongrel进程使用了​​大约4GB的内存。我做了一些关于调试ruby内存泄漏的研究,并且找不到多少。所以我有两个问题。

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

7 个答案:

答案 0 :(得分:37)

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

第一个是对ObjectSpace中对象的内存使用情况的图形化探索。

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

对于特定的编码模式,根据经验,你必须观看任何处理文件io,图像处理,处理大量字符串等的事情。

我会检查你是否使用了最合适的XML库 - 众所周知ReXML很慢并且被认为是漏洞(我没有证明这一点!)。还要检查是否可以进行memoize昂贵的操作。

答案 1 :(得分:17)

在每个请求之后或之前记录内存使用情况的超级简单方法(仅适用于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

然后只监视顶部,当请求使您的内存使用量跳跃时,请检查日志。当然,这只有在大跳跃时发生内存泄漏时才有用,而不是很小的增量。

答案 2 :(得分:6)

内存泄漏是当前ruby实现中的一个问题,这是一个很好的起点 http://whytheluckystiff.net/articles/theFullyUpturnedBin.html 为什么thetheluckystiff网站不再存在,但你可以在这里找到原始文章: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

答案 3 :(得分:5)

您应该查看ruby-prof

答案 4 :(得分:2)

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

答案 5 :(得分:2)

现在,您可以运行以下命令以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

并获得一个漂亮的图表。

答案 6 :(得分:0)

这些宝石对我有用:

MemoryLogic

  

在rails日志中添加proccess id和memory usage,非常适合跟踪内存泄漏

Oink

  

记录解析器以识别显着增加VM堆大小的操作