我在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
答案 0 :(得分:3)
我尝试使用乘客(它会自动重新启动并管理内存中变得过大的rails实例 - 比重新启动那些误导内存限制的mongrel更容易)。另外,你可能会对运行1.8.7的ruby企业版fork有好运,它从1.9回溯了一些内存管理修复(比如允许VM在使用更少的内存时缩小) - 这种改变可能已经恢复正常1.8.7虽然虽然我不确定。 REE的主张是,对于rails应用程序,可以减少33%的内存消耗。
Ruby的东西通常会随着时间的推移而增长,需要重新启动,而乘客则会自动为您完成。它对我来说很完美,所以我真的可以推荐它。
它还具有良好的内存分析功能
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_analysis_and_system_maintenance