ruby/ruby on Rails 内存泄漏检测
-
03-07-2019 - |
题
我使用 ruby on Rails 编写了一个小型 Web 应用程序,其主要目的是上传、存储和显示 xml(文件最多可达几 MB)文件的结果。运行大约 2 个月后,我注意到杂种进程使用了大约 4GB 内存。我做了一些关于调试 ruby 内存泄漏的研究,但没有找到太多。所以我有两个问题。
- 有没有什么好的工具可以用来查找 Ruby/rails 中的内存泄漏?
- 哪些类型的编码模式会导致 ruby 中的内存泄漏?
解决方案
在 Rails 中查找内存泄漏的一些技巧:
- 使用 荒凉山庄 插入
- 实施 侦察监控 特别是内存使用分析器
实施 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
然后只要监控top,当一个请求让你的内存使用量跳跃时,就去查看日志。当然,只有当内存泄漏发生在大的跳跃而不是微小的增量中时,这才会有帮助。
内存泄漏是当前 ruby 实现中的一个问题,一个很好的起点是http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Whytheluckystiff 网站不再存在,但您可以在这里找到原始文章: 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
你应该看看 红宝石教授.
切换到 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
并得到一个漂亮的图表。