我在 Rails 应用程序中遇到问题。几个小时后,应用程序似乎开始挂起,我无法找到问题所在。日志文件中没有任何相关内容,但是当我尝试从浏览器获取 url 时,什么也没发生(比如 mongrel 接受请求但无法响应)。
你认为我可以测试什么来了解问题出在哪里?
谢谢你的帮助!
我在 Rails 应用程序中遇到问题。几个小时后,应用程序似乎开始挂起,我无法找到问题所在。日志文件中没有任何相关内容,但是当我尝试从浏览器获取 url 时,什么也没发生(比如 mongrel 接受请求但无法响应)。
你认为我可以测试什么来了解问题出在哪里?
谢谢你的帮助!
我可能会因为回避这个问题而被否决,但我最近从 nginx + mongrel 转到了 mod_rails 并且印象非常深刻。转向更简单的设置无疑会在未来让我头疼。
这是一个非常简单的过渡,我强烈推荐它。
我有同样的问题。我缩小范围的几个选项与 MySQL 适配器相关。我在 Red Hat Enterprise Linux 4(或 5)上运行,应用程序会在给定的空闲时间后挂起。
一种建议的解决方案是编译原生 MySQL 绑定,我一直在使用纯 Ruby 绑定。
另一个是将 MySQL 适配器上的超时设置为高于连接空闲的时间。(我没有记录具体的配置,但我记得它在 environment.rb 中,它是 mysql 适配器中的一些类变量。)
我不记得这些解决方案中的任何一个是否解决了它,在那之后不久我们就搬到了 Ubuntu 并且从那以后没有遇到任何问题。
Check the Mongrel FAQ: http://mongrel.rubyforge.org/wiki/FAQ
From my experience, mongrel hangs when:
ActiveRecord::Base.verification_timeout = 14400
(this is further explained in the deployment section of the FAQ)我们也遇到过同样的问题。首先,安装 mongrel_proctitle gem
http://github.com/rtomayko/mongrel_proctitle/tree/master
这个 gem/plugin 将允许您通过“ps”查看 mongrel 进程,您可以查看 Mongrel 是否挂起。我们在 Mongrel 中看到的一个问题是它会很高兴地接受连接并将它们排入队列,然后将自身楔入。此插件将帮助您查看 Mongrel 何时被楔入,但您必须使用另一个监控应用程序来实际重新启动楔入的 Mongrel,例如Monit或God
您可能还想考虑在您的 Mongrel 前面放置一个更平衡的反向代理,即 HAproxy,而不是 nginx、Apache 或 Lighttpd。通过在 HAproxy 中设置“maxconn 1”,您可以确保队列由 HAproxy 与 Mongrel 维护。其他反向代理(nginx、Apache、Lighttpd)只做循环,这意味着它们可以在不经意间加载你的 Mongrel 队列。
我个人的选择是上帝,因为它更灵活。
tl;dr 安装这个 gem 插件并留意你的 Mongrels。试试 Apache+Phusion 乘客。
不幸的是,Rails(以及 Mongrel)随着时间的推移消耗过多内存并崩溃是一个已知问题(50K+ 谷歌条目“Ruby, rails, crashing, memory”)。当前的 ruby 解释器具有这样的特性,它有时完全无法将内存还给系统——它可能会重用它拥有的内存,但不会放弃它。
在生产环境中有许多监控、杀死和重启 Mongrel 实例的方案——例如:(随机选择)rails monitor。在更果断地解决问题之前,其中之一可能是您最好的选择。
您确定问题是由 Mongrel 引起的吗?您是否尝试过在 WEBrick 下运行您的应用程序?
您可以检查几件事,但是由于您说日志中没有任何内容指示错误,听起来您在使用Logger
该类的日志轮换功能时可能会遇到错误。它会导致杂种被锁定。与其依赖Logger
轮换日志,不如考虑使用logrotate
或其他一些外部日志轮换服务。
这是否每次都在固定的小时数/天数内发生?你有多少内存?