Rails应用程序占用了所有服务器内存

时间:2012-07-22 11:32:17

标签: ruby-on-rails-3 memory-leaks nginx passenger

我在ubuntu VPS(1GB RAM)上运行一个rails应用程序(带有mongodb和memcached的Passenger和nginx)应用程序 - 从几天开始,我看到在启动nginx之后,ruby进程慢慢占用了所有的内存即使服务器上没有请求,也可以使用该框。 new_relic显示以下内容 enter image description here

顶部输出

top - 12:02:23 up  2:47,  1 user,  load average: 0.03, 0.02, 0.00
Tasks:  16 total,   1 running,  15 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1048576k total,  1048576k used,        0k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

9993 mongodb   18   0  128m  29m  21m S    0  2.9   0:17.06 mongod                                                                                      
1135 nobody    18   0 71664  18m  856 S    0  1.8   0:00.55 memcached                              
14310 passenge  15   0  500m 434m 4660 S    0 42.5   0:13.59 ruby
15496 passenge  15   0  425m 360m 4648 S    0 35.3   0:13.06 ruby   

我认为有一些代码泄露了内存 - 或者我需要以某种方式在乘客达到某个阈值时以某种方式杀死昂贵的ruby进程。 请分享关于这两个问题的一些想法。

1 个答案:

答案 0 :(得分:0)

很难回答,因为没有太多信息可以继续,所以我会相当一般地回答这个问题。显示内存使用情况的图表或显示响应时间降低的图表会很有帮助。

无论如何,我有一个类似的设置(Rails / Passenger / Nginx / MongoDB / VPS-1GB)。

  • 首先通过检查日志来确认您没有请求,以确认没有请求(并确保在Nginx中打开日志已足够)

  • 尝试禁用New Relic(随着时间的推移,这个心跳到他们的服务器),并查看您拥有的任何其他监控软件(例如Nagios)。

  • 尝试使用免费的负载测试应用程序(例如http://loadimpact.com),并在主动负载测试时观察内存/ GC和处理器图形。如果你看到内存使用率上升超过健康数量,你可以打赌你在某处有内存泄漏。

如果你发现了,那真的只是消除变量的问题 - 我会暂停Rails而不是Nginx,但是你可以在没有前端的情况下运行Rails,或者关闭乘客并且只需点击Nginx中的所有静态资产试图找到原因。

希望这有帮助。