我有一个在 Apache 上使用 Passenger 运行的 Rails 2.3.2 应用程序,最近,最奇怪的事情开始发生。
每隔一段时间,应用程序就会完全停止处理请求,所有请求都会备份,直到超时。重新启动 Apache 似乎是唯一的解决方法。在发生这种情况之前,系统的负载相对较轻,此时系统根本没有负载。
我意识到这没什么可说的,但我怎么才能弄清楚是什么原因造成的呢?值得注意的是,全局队列已打开;Ruby 是 ruby-enterprise-1.8.6-20080610;Passenger 是上述 Ruby Enterprise Edition 附带的版本。
答案1
我发现有用的一个资源是乘客用户指南部分他们谈论这个:
如果您的一个应用程序实例被冻结(停止响应),那么您可以通过使用 SIGABRT 终止它来找出冻结的位置。这将导致应用程序引发异常并进行回溯。
答案2
可能是代码出了问题?等待输入的某些东西阻塞了线程,导致多个进程处于等待状态?
答案3
既然你不知道问题的原因是什么,我想你应该确保至少记录了所有内容。崩溃前的最后几个日志条目可能会揭示罪魁祸首。
问题可能出在代码中。好吧,为了找出答案,您可以部署一个非常简单的 rails 应用程序,这样代码就不会成为问题,但使用完全相同的设置(apache + 乘客 + REE),并在夜间使用一个小的 ruby 脚本向它发送请求。在您的个人计算机上运行它,看看它是否崩溃。当然,您必须确保您以完全相同的方式设置了您的环境。
也有可能您的内存不足,但这取决于您的应用程序和系统的具体情况。这个帖子我想到了。您可能想尝试修改 REE 的内存管理设置,如帖子中所述,看看它是否能解决问题(无论如何尝试一下也不会有什么坏处)。
如果您还没有这样做的话,我建议您也在 stackoverflo 上发布这个问题。
答案4
另一个可能的答案:众所周知,RMagick 会导致 Passenger 和智能生成出现问题。
此主题来自 Passenger 邮件列表有更多信息:
看起来这个问题可能已经在 REE 20090113 中得到修复,但我认为它只是发生得比较少。今天早上我在 Centos 4 64 位上运行的 Passenger 2.0.6 和 REE 20090113 上发现了一个冻结的进程。