在轨道上内存泄漏检测红宝石/红宝石(ruby/ruby on rails memory leak d

2019-08-31 17:03发布

我写了使用Ruby on Rails的一个小的Web应用程序,其主要目的是上传,从XML存储和显示结果(文件可高达数MB)的文件。 约2个月运行后,我注意到,杂种过程约使用4GB的内存。 我做了调试红宝石内存泄漏一些研究,并没有发现多大。 所以,我有两个问题。

  • 是否有可用于查找的Ruby / Rails的内存泄漏什么好的工具吗?
  • 什么类型的编码模式导致红宝石内存泄漏?

Answer 1:

一些提示找到Rails的内存泄漏:

  • 使用荒凉山庄插件
  • 实施侦察监视特别是内存使用分析器
  • 实施FiveRuns监测
  • 尝试另一种简单的内存使用记录仪

第一种是通过在对象空间的对象的内存使用情况的图形探索。

最后两个将帮助您识别正在膨胀的内存使用特定的使用模式,并可以从那里工作。

至于具体的编码图案,从经验中你必须注意任何真实处理文件IO,图像处理,进行大规模的字符串等工作。

我会检查您是否使用最适当的XML库 - REXML被称为是缓慢的,认为是漏水的(我没有这方面的证据!)。 另外,请检查您是否可以memoize的昂贵的操作。



Answer 2:

一个超级简单的方法来后或(仅限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

然后,只需显示器顶部,当一个请求让您的内存使用跳跃,去检查日志。 这当然,只会如果您有发生大的跳跃,而不是微小的增量内存泄漏帮助。



Answer 3:

内存泄漏是在目前的Ruby实现的一个问题开始约一个很好的地方是http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Whytheluckystiff网站已经不存在了,但你可以在这里找到原来的文章: HTTP:/ /viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

对问题的一个更具体的答案与长时间运行的红宝石进程看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



Answer 4:

你应该给看看,以红宝石教授 。



Answer 5:

切换到JRuby和使用Eclipse的内存分析器 。 还有目前的Ruby没有类似的工具。



Answer 6:

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

并得到一个不错的图形。



Answer 7:

这些宝石为我工作:

MemoryLogic

在添加ID proccess和内存使用情况在Rails日志,很好的跟踪内存泄漏

日志分析器,以确定哪些显著增加VM堆大小行动



文章来源: ruby/ruby on rails memory leak detection