2

我在没有配置任何交换空间的虚拟服务器上运行带有 apache+passenger 的 rails 应用程序。

该站点通过每天 200K+ 的请求获得了可观的流量,有时整个系统内存不足,导致整个系统出现异常行为。

问题是有什么方法可以配置 apache 或乘客不耗尽内存(例如,当乘客实例开始使用时优雅地重新启动,比如超过 300M 的内存)。

服务器有 4GB 的内存,目前我正在使用乘客的 PassengerMaxRequests 选项,但它似乎不是这里最可靠的解决方案。

目前,我也无法切换到 nginx,所以这不是保留一些空间的选择。

欢迎任何我可能遗漏的聪明想法。

编辑:我的临时解决方案

当 Rails 实例超过一定的内存使用量时,我没有去重启它们。Engine Yard 写了一篇关于ActiveRecord 内存膨胀问题的精彩博文。这是我们对这个问题的主要怀疑。由于我没有太多时间来优化应用程序,我将PassengerMaxRequests 设置为300,并为服务器增加了额外的2GB 内存。从那以后情况一直很好。起初我担心不断重启 Rails 实例会使其变慢,但它似乎没有我应该担心的影响。

4

4 回答 4

1

如果您的意思是“限制”为杀死这些进程并且这是服务器上唯一的应用程序并且它是 Linux,那么您有两种选择:

设置一个进程可以拥有的最大内存量:

# ulimit -m
unlimited

或者使用 cgroups 进行类似的行为:

http://en.wikipedia.org/wiki/Cgroups

于 2012-01-19T15:29:58.857 回答
0

我没有固定解决方案,但您可能希望使用Passenger 附带的两个命令来跟踪内存使用情况和进程的nr:passenger-status并且sudo passenger-memory-stats,请参阅 Nginx 的Passenger 用户指南或 Apache的Passenger 用户指南。

于 2010-01-07T07:49:30.113 回答
0

我建议不要重新启动超过“内存限制”的实例(如果可能的话),因为这可能会使您的系统陷入无限循环,其中一个进程反复达到该限制并重新启动。

也许您可以编写一个简单的守护进程,它不断监视进程,并杀死任何超过一定内存量的进程。请务必记录有关执行此操作的过程的任何信息,以便您可以在出现问题时解决问题。

我也会考虑在那里获得一些真正的交换空间......这似乎是一个糟糕的黑客攻击。

于 2009-09-21T19:30:29.150 回答
0

我有一个问题,乘客流程最终会失控并消耗太多内存。我编写了以下脚本,它一直在帮助控制事情,直到我找到真正的解决方案http://www.codeotaku.com/blog/2012-06/passenger-memory-check/index。这可能会有所帮助。

乘客 Web 实例不包含重要状态(一般而言),因此杀死它们通常不是一个过程,乘客将在需要时重新启动它们。

于 2012-06-14T07:54:10.723 回答