我写了使用Ruby on Rails的一个小的Web应用程序,其主要目的是上传,从XML存储和显示结果(文件可高达数MB)的文件。 约2个月运行后,我注意到,杂种过程约使用4GB的内存。 我做了调试红宝石内存泄漏一些研究,并没有发现多大。 所以,我有两个问题。
- 是否有可用于查找的Ruby / Rails的内存泄漏什么好的工具吗?
- 什么类型的编码模式导致红宝石内存泄漏?
我写了使用Ruby on Rails的一个小的Web应用程序,其主要目的是上传,从XML存储和显示结果(文件可高达数MB)的文件。 约2个月运行后,我注意到,杂种过程约使用4GB的内存。 我做了调试红宝石内存泄漏一些研究,并没有发现多大。 所以,我有两个问题。
一些提示找到Rails的内存泄漏:
第一种是通过在对象空间的对象的内存使用情况的图形探索。
最后两个将帮助您识别正在膨胀的内存使用特定的使用模式,并可以从那里工作。
至于具体的编码图案,从经验中你必须注意任何真实处理文件IO,图像处理,进行大规模的字符串等工作。
我会检查您是否使用最适当的XML库 - REXML被称为是缓慢的,认为是漏水的(我没有这方面的证据!)。 另外,请检查您是否可以memoize的昂贵的操作。
一个超级简单的方法来后或(仅限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 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
你应该给看看,以红宝石教授 。
切换到JRuby和使用Eclipse的内存分析器 。 还有目前的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
并得到一个不错的图形。
这些宝石为我工作:
MemoryLogic
在添加ID proccess和内存使用情况在Rails日志,很好的跟踪内存泄漏
哼
日志分析器,以确定哪些显著增加VM堆大小行动