在 Rails 应用程序中查找内存泄漏

Posted

技术标签:

【中文标题】在 Rails 应用程序中查找内存泄漏【英文标题】:Find memory leaks in a Rails application 【发布时间】:2011-09-15 07:35:52 【问题描述】:

我有一个使用 Ruby on Rails 的 Web 应用程序。我们使用在 apcahe httpd 上启动的 mongrel 集群来运行应用程序。我们一直面临应用程序中大量内存消耗的问题。 (红帽,Ruby 1.8.7,Rails 2.3.5,内存 8GB)

问题是在我们启动 web 服务器(启动 mongrel 集群)之后,内存使用量似乎在增加。例如,如果我启动 Web 服务器时的可用内存 (RAM) 为 6GB。 2 天后,即使网站没有流量,可用内存也变为 3GB。如果网络服务器一周未重新启动,内存似乎会增加并使用完整的 8GB RAM,并导致使用“PrinceXML”生成 pdf 等进程“没有内存分配”的问题,使用 sendmail 发送邮件(我认为这些是记忆 )。当 Web 服务器重新启动时,可用内存恢复到 6GB。

这是 Rails 应用程序中的内存泄漏情况吗?如何检查应用程序的内存泄漏?我找到了一个检查内存泄漏的工具bleak_house,但是当我将它安装为this link 中所示的gem 时,当我运行'bleak /tmp/bleak.5979.000.dump' 进行分析时,它会给出No command bleak found

我正在使用 PrinceXML 生成 PDF 报告和 sendmail 用于发送邮件。该服务器还运行了一个 Jasper 服务器实例。 请大家帮忙

这是内存过载时top命令的结果。

-bash-3.2$ top

top - 10:34:10 up 14 days,  7:40,  2 users,  load average: 0.24, 0.40, 0.39
Tasks: 181 total,   1 running, 177 sleeping,   2 stopped,   1 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8173984k total,  8011564k used,   162420k free,    10044k buffers
Swap:  2096472k total,   152624k used,  1943848k free,  2012016k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
  858 **nt*rsc  15   0 12748 1168  832 R 173.5  0.0   0:00.36 top               
    1 root      15   0 10356  108   76 S  0.0  0.0   0:17.10 init               
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.10 migration/0        
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.09 ksoftirqd/0        
    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0         
    5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.12 migration/1        
    6 root      34  19     0    0    0 S  0.0  0.0   0:00.12 ksoftirqd/1        
    7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1         
    8 root      RT  -5     0    0    0 S  0.0  0.0   0:00.70 migration/2        
    9 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/2        
   10 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/2         
   11 root      RT  -5     0    0    0 S  0.0  0.0   0:00.67 migration/3        
   12 root      34  19     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/3        
   13 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/3         
   14 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 events/0           
   15 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 events/1           
   16 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 events/2

【问题讨论】:

【参考方案1】:

我会尝试使用乘客(它会自动重新启动和管理内存增长过大的 Rails 实例 - 比重新启动偏离正常内存限制的杂种要容易得多)。此外,您可能对 1.8.7 的 ruby​​ 企业版分支很幸运,它从 1.9 向后移植了一些内存管理修复(比如允许虚拟机在使用较少内存时缩小) - 虽然这种变化可能已经恢复到正常的 1.8.7 ,虽然我不确定。 REE 声称您可以将 Rails 应用程序的内存消耗减少 33%。

Ruby 的东西通常会随着时间的推移而增长,并且需要重新启动,而使用乘客它会自动为您完成。它对我来说非常有效,所以我真的可以推荐它。

http://www.modrails.com/

它还有很好的记忆分析功能

http://www.modrails.com/documentation/Users%20guide%20Apache.html#_analysis_and_system_maintenance

【讨论】:

ModRails 似乎是解决我们现在在 Rails 中遇到的所有部署问题的答案......我一定会尝试一下......

以上是关于在 Rails 应用程序中查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 应用程序/内存泄漏中分析延迟作业任务

如何在源代码中查找内存泄漏

Ruby 生产服务器内存泄漏

ruby/ruby on rails 内存泄漏检测

使用 Eclipse 内存分析器查找内存泄漏

使用 VS Code 在 C++ 应用程序中查找内存泄漏