2011-03-16 49 views
0

我正在运行一个已部署的rails web服务器,并且遇到内存问题。每次我尝试调用sendmail时,都会收到Errno :: ENOMEM错误。当我在服务器上运行'top'时,它显示出2个ruby1.8进程正在运行,每个进程消耗大约40%的内存。这是由我的代码泄漏造成的,还是我启动了两个同时进行的ruby进程?红宝石和铁轨性能问题,服务器

这两个进程都由我的部署者帐户运行,然后在我推送到我的生产git存储库(使用pushand)时调用它们。我试图找出是否这是自然的(即服务器需要升级),或者如果我在我的设置中有某种错误。我最近将RAM从256 MB升级到了512 MB,之前没有这个问题。

问题是防止访问者创建用户,因为应用程序在他们应该收到激活电子邮件时会抛出错误。

请注意,我在apache和乘客的ubuntu安装上运行rails 2.1.0。

+0

当我重新启动Apache内存使用率急剧下降。我已经将PoolIdleTime设置从1天减少到300秒,所以现在和再次的乘客程序都会被杀死。 – kalusn 2011-03-16 12:37:56

+0

我也在研究Rack :: Bug,Oink和Memorylogic。我发现[link](http://www.engineyard.com/blog/2009/thats-not-a-memory-leak-its-bloat/)非常有用。 – kalusn 2011-03-16 12:39:14

+0

虽然问题仍然存在。我会尝试和优化领域,如果我找到答案,回到这里。 – kalusn 2011-03-16 13:27:03

回答

2

好吧,我猜这是我不得不自助的一种情况,我确实很高兴我做到了。我没有使用任何我链接到的工具。

我通过登录我的服务器。 ssh并在两个屏幕窗口中运行了两个命令:top和tail -f /var/www/mysite.com/log/production.log。

我查看了实时日志文件,发现需要花费很长时间才能加载的页面请求 - 用户可以显示他/她的图像的页面,每个用户都通过他们的名字标识。 acts_as_taggable_on。这个单个请求花了6秒钟。

它不断弹出。我想我已经看了6或7次,我决定进一步调查。它始终是相同的用户ID,所以我决定查找用户。事实证明,用户有一个空白的名字,“”,并已标记的图像是由

Asset.tagged_with(@user.name, :on => "users") 

现在,在我的应用程序中,有成千上万的资产10S和Asset.tagged_with(“”: on =>“users”)会返回所有这些,从而吃掉我的记忆。

现在我已经处理了一个用户有一个空白名称的情况,并且它已经被所有新用户需要。尽管没有人提供帮助,但我仍然对stackoverflow感到有些感慨,因为有时候就像问问题来解决问题一样简单。

+0

不错的发现,我认为没有人能够帮助你比你的“对墙说话”技术做得更好。如果您的数据库支持CHECK约束,那么我会为此添加一个,并尽可能多地创建列。NOT NULL可用于额外的偏执狂:破碎的代码很容易修复,破坏的数据不是那么多。 – 2011-03-16 16:40:13