为什么Rails和Passenger会占用我的记忆?

时间:2009-06-18 22:44:52

标签: ruby-on-rails apache2 passenger

我正在使用256片Slicehost并运行Apache和Passenger来托管我的Rails应用程序。 我不得不经常进行硬重启。当我看到这个乘客记忆统计数据时。

--------- Passenger processes ---------
 ** [out :: welcometonewnepal.com] PID   Threads  VMSize    Private  Name
 ** [out :: welcometonewnepal.com] ---------------------------------------
 ** [out :: welcometonewnepal.com] 8246  11       <b>84.1 MB   0.1 MB   /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/ApplicationPoolServerExecutable</b> 0 /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/bin/passenger-spawn-server  /usr/bin/ruby1.8  /tmp/passenger.4217
 ** [out :: welcometonewnepal.com] 8247  2        <b>57.1 MB   0.2 MB   Passenger spawn server</b>
 ** [out :: welcometonewnepal.com] 8903  1        <b>185.6 MB  9.6 MB   Passenger ApplicationSpawner:</b> /home/deploy/rails_apps/welcometonewnepal/production/current
 ** [out :: welcometonewnepal.com] 9065  1        <b>195.1 MB  76.6 MB  Rails:</b> /home/deploy/rails_apps/welcometonewnepal/production/current
 ** [out :: welcometonewnepal.com] ### Processes: 4
 ** [out :: welcometonewnepal.com] ### Total private dirty RSS: 86.43 MB

看到粗体大小,为什么它会如此耗费记忆?

5 个答案:

答案 0 :(得分:4)

根据这些统计数据不能肯定地说。

但要帮助降低它:

  • 使用Nginx而不是Apache
  • 使用Ruby Enterprise Edition - 看起来你只是使用常规的1.8.6 / 7 ......那里浪费了内存

此外,您的应用中是否有很多宝石和/或插件?

答案 1 :(得分:4)

它没有占用那么多记忆......你需要注意的那一栏是标有“私人”的栏目 如果将它们全部添加(并且它在底部),您将看到乘客及其相关进程仅占用86MB内存。其中大部分也被应用程序的大小占用(76MB)。

您可能需要告诉我们您在服务器上运行的其他内容...安装htop并按内存排序以获得想法。

答案 2 :(得分:0)

你需要做一些memory profiling

答案 3 :(得分:0)

如果您在64位环境中运行,请尝试切换到32位。 Rails / Ruby倾向于在32位环境中使用更少的内存。

答案 4 :(得分:0)

您是否已调整Apache或数据库设置?我发现一个Wordpress博客+一个小的Rails应用程序对于256MB切片使用默认的Ubuntu配置太多了。

在Apache(Prefork MPM)中尝试以下设置:

#KeepAlive On
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 4

<IfModule prefork.c>
StartServers       5
MinSpareServers    5
MaxSpareServers    10
MaxClients         40
MaxRequestsPerChild 1
</IfModule>

在我的情况下,我不得不将MaxClients进一步调低到25.我曾经每周从Slicehost获得2-3封交换警告电子邮件,但是自从我切换后我在2周内没有收到任何电子邮件。设置。如果您使用的是WorkerMPM分支,则您的设置将有所不同。

如果您使用的是MySQL,请在不使用InnoDB的情况下禁用InnoDB表。这可以为你节省相当多的内存。