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

时间:2011-09-15 07:35:52

标签: ruby-on-rails ruby memory-management memory-leaks

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

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

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

我正在使用PrinceXML生成PDF报告和sendmail以用于邮件发送目的。该服务器还有一个运行Jasper Server的实例。 任何人请帮助

以下是内存过载时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 个答案:

答案 0 :(得分:3)

我尝试使用乘客(它会自动重新启动并管理内存中变得过大的rails实例 - 比重新启动那些误导内存限制的mongrel更容易)。另外,你可能会对运行1.8.7的ruby企业版fork有好运,它从1.9回溯了一些内存管理修复(比如允许VM在使用更少的内存时缩小) - 这种改变可能已经恢复正常1.8.7虽然虽然我不确定。 REE的主张是,对于rails应用程序,可以减少33%的内存消耗。

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

http://www.modrails.com/

它还具有良好的内存分析功能

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

相关问题