杂种挂了

时间:2009-01-11 23:00:50

标签: ruby-on-rails ruby mongrel

我遇到了Rails应用程序中的问题。 几个小时后,应用程序似乎开始挂起,我无法找到问题所在。日志文件中没有任何相关内容,但是当我尝试从浏览器中获取URL时没有发生任何事情(例如mongrel接受请求但无法响应)。

您认为我可以测试什么来了解问题所在?

感谢您的帮助!

8 个答案:

答案 0 :(得分:1)

我可能因为躲避这个问题而被拒绝,但我最近从nginx + mongrel转移到了mod_rails并且给我留下了深刻的印象。转向更简单的设置无疑将使我在将来免于头痛。

这是一个非常简单的过渡,我强烈推荐它。

答案 1 :(得分:0)

你确定问题是由Mongrel造成的吗?您是否尝试在WEBrick下运行应用程序?

答案 2 :(得分:0)

a few things you can check,但是由于您说日志中没有任何内容可以指示错误,因此在使用Logger类的日志轮换功能时,您可能会遇到错误。它导致杂种锁定。不要依赖Logger来轮换日志,而应考虑使用logrotate或其他一些外部日志轮换服务。

答案 3 :(得分:0)

每次都会在一定数量的小时/天内发生这种情况吗?你有多少RAM?

答案 4 :(得分:0)

我有同样的问题。我把它缩小的几个选项是MySQL适配器相关的。我在Red Hat Enterprise Linux 4(或5)上运行,应用程序会在给定的空闲时间后挂起。

一个建议的解决方案是编译本机MySQL绑定,我一直在使用纯Ruby。

另一种方法是将MySQL适配器上的超时设置为高于连接空闲时的超时。 (我没有记录特定的配置,但我记得它在environment.rb中,它是mysql适配器中的一些类变量。)

我不记得,如果其中任何一个解决方案修复它,我们在此之后不久就转移到Ubuntu并且从那时起就没有问题。

答案 5 :(得分:0)

查看Mongrel常见问题解答: http://mongrel.rubyforge.org/wiki/FAQ

根据我的经验,mongrel挂起时:

  • 日志文件太大(数百兆字节)。你必须设置日志轮换。
  • MySQL驱动程序超时 您必须通过将此驱动程序添加到您的environment.rb来更改MySQL驱动程序的超时设置: ActiveRecord::Base.verification_timeout = 14400 (这在FAQ的部署部分进一步说明)

答案 6 :(得分:0)

我们遇到过同样的问题。首先,安装mongrel_proctitle gem

http://github.com/rtomayko/mongrel_proctitle/tree/master

这个gem /插件允许你通过“ps”查看杂种进程,你可以看到Mongrel是否挂起。我们在Mongrel看到的一个问题是,它会愉快地接受连接并将它们排列,然后楔入它们自己。这个插件将帮助您查看Mongrel何时被楔入,但是您必须使用另一个监控应用程序来实际重启一个楔形Mongrel,例如MonitGod

您可能还想考虑在Mongrels前面放置一个更平衡的反向代理,这是HAproxy,而不是nginx,Apache或Lighttpd。通过在HAproxy中设置“maxconn 1”,您可以确保HAproxy与Mongrel维护队列。其他反向代理(nginx,Apache,Lighttpd)只进行循环,这意味着他们可以无意中加载你的Mongrel队列。

我个人的选择是上帝,因为它更灵活。

tl; dr安装这个gem插件并密切关注你的Mongrels。试试Apache + Phusion Passenger。

答案 7 :(得分:0)

不幸的是,Rails(以及Mongrel)随着时间的推移耗尽了大量内存并且崩溃是一个众所周知的问题(50K + Google条目用于“Ruby,rails,crashing,memory”)。当前的ruby解释器具有sometimes simply fails entirely to give memory back to the system的属性 - 它可以重用它拥有的内存,但它不会放弃它。

在生产环境中有许多监控,查杀和重启Mongrel实例的方案 - 例如:(随意选择)rails monitor。直到问题得到更果断的解决,其中一个可能是你最好的选择。