我可以在没有交换空间的服务器上限制apache +乘客内存使用量

时间:2009-09-21 19:19:55

标签: ruby-on-rails apache memory passenger swap

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

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

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

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

目前,我也无法切换到nginx,因此不能保留一些空间。

欢迎任何我可能遗失的聪明主意。

编辑:我的临时解决方案

当超过一定数量的内存使用量时,我没有重新启动Rails实例。 Engine Yard在ActiveRecord memory bloat issue上撰写了很棒的博文。这是我们对这个问题的主要怀疑。由于我没有太多时间来优化应用程序,我将PassengerMaxRequests设置为300并为服务器添加了额外的2GB内存。从那时起事情一直很好。起初我担心重新启动Rails实例会让它变慢但它似乎没有影响我应该担心。

4 个答案:

答案 0 :(得分:1)

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

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

# ulimit -m
unlimited

或者使用cgroups来表现类似行为:

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

答案 1 :(得分:0)

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

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

我还会考虑在那里获得一些真正的交换空间......这看起来像是一个糟糕的黑客。

答案 2 :(得分:0)

我没有固定解决方案,但您可能希望使用Passenger附带的两个命令来跟踪内存使用情况和进程数:passenger-statussudo passenger-memory-stats,请参阅 Passenger users guide for NginxPassenger users guide for Apache

答案 3 :(得分:0)

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

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