ruby / ruby on rails内存泄漏检测
我编写了一个使用ruby on rails的小型Web应用程序,其主要目的是上传,存储和显示xml(文件最多可以包含几个MB)文件的结果。运行大约2个月后,我注意到杂种进程正在使用大约4GB的内存。我对调试ruby内存泄漏进行了一些研究,但发现不多。所以我有两个问题。
- 有没有什么好的工具可以用来发现Ruby / rails中的内存泄漏?
- 哪种类型的编码模式会导致红宝石内存泄漏?
解决方案
在当前的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
在Rails中查找内存泄漏的一些技巧:
- 使用Bleak House插件
- 专门实现Scout监视内存使用情况探查器
- 实施FiveRuns监控
- 尝试另一个简单的内存使用记录器
第一个是对象空间中对象对内存使用情况的图形化探究。
最后两个将确定导致内存使用膨胀的特定使用模式,我们可以从那里开始工作。
至于特定的编码模式,根据经验,我们必须注意处理文件io,图像处理,使用大量字符串等的内容。
我将检查我们是否正在使用最合适的XML库ReXML已知运行缓慢且被认为泄漏(我没有证据!)。还要检查我们是否可以记住昂贵的操作。
在每个请求之后或者之前记录内存使用情况的超级简单方法(仅适用于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
然后仅监视顶部,当一个请求使内存使用量增加时,请检查日志。当然,只有在内存泄漏发生在较大的跃迁而不是很小的增量中时,这才有帮助。
切换到jruby并使用Eclipse Memory Analyzer。
目前没有与Ruby相类似的工具。
现在,我们可以运行以下命令以R可以读取的格式获取内存。我假设日志行如下所示:
1234567890 RAM USAGE: 27456K
运行此命令(或者修改为套件):
$ grep 'RAM USAGE' fubar.log | awk '{print s " " " " ; 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
并得到一个漂亮的图。