2009-06-18 54 views
0

我在Slicehost的256片上運行Apache和Passenger來託管我的Rails應用程序。 我不得不經常做硬重啓。當我看着這個乘客記憶統計。爲什麼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 

以粗體顯示尺寸,爲什麼它會如此吃掉內存?

回答

4

單憑這些數據無法肯定。

但是爲了幫助降低它:

  • 使用Nginx的過阿帕奇
  • 使用Ruby企業版 - 看起來像你只是使用常規1.8.6/7 ...這是浪費內存在那裏

另外,你的應用程序中是否有很多寶石和/或插件?

+0

針對RubyEE的+1。沒有它,乘客幾乎是無用的。而NginX正在快速發展,但Apache(IMO)更易於使用。 – 2009-06-19 06:13:42

+0

REE的另一個+1。 – 2009-06-19 06:23:55

+0

我已經在使用REE了! – Autodidact 2009-08-26 15:31:41

4

它沒有佔用那麼多的內存......你需要注意的一欄是標記爲「私人」的一欄。
如果你把它們全部加起來(它在底部),你會看到乘客及其相關進程只佔用86MB的內存。它的大部分也被你的應用程序的大小佔據(76MB)。

你可能需要讓我們知道你在服務器上運行着什麼......安裝htop並按內存排序以得到一個想法。

0

如果您在64位環境中運行,請嘗試切換到32位。 Rails/Ruby傾向於在32位環境中使用更少的內存。

0

您是否調整過Apache或您的數據庫設置?我發現一個WordPress的博客+一個小的Rails應用程序對於默認的Ubuntu配置256MB的切片太多了。

嘗試在阿帕奇(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我用來從每週2-3交換電子郵件警告Slicehost,但自從我切換設置後的兩週內我還沒有收到任何信息。如果您使用的是WorkerMPM分叉,那麼您的設置將會有所不同。

如果您使用的是MySQL,如果您不使用InnoDB,請禁用InnoDB表。這可以爲您節省相當多的內存。