2011-03-16 74 views
0

我正在運行一個已部署的rails web服務器,並且遇到內存問題。每次我嘗試調用sendmail時,都會收到Errno :: ENOMEM錯誤。當我在服務器上運行'top'時,它顯示出2個ruby1.8進程正在運行,每個進程消耗大約40%的內存。這是由我的代碼泄漏造成的,還是我啓動了兩個同時進行的ruby進程?紅寶石和鐵軌性能問題,服務器

這兩個進程都由我的部署者帳戶運行,然後在我推送到我的生產git存儲庫(使用pushand)時調用它們。我試圖找出是否這是自然的(即服務器需要升級),或者如果我在我的設置中有某種錯誤。我最近將RAM從256 MB升級到了512 MB,之前沒有這個問題。

問題是防止訪問者創建用戶,因爲應用程序在他們應該收到激活電子郵件時會拋出錯誤。

請注意,我在apache和乘客的ubuntu安裝上運行rails 2.1.0。

+0

當我重新啓動Apache內存使用率急劇下降。我已經將PoolIdleTime設置從1天減少到300秒,所以現在和再次的乘客程序都會被殺死。 – kalusn 2011-03-16 12:37:56

+0

我也在研究Rack :: Bug,Oink和Memorylogic。我發現[link](http://www.engineyard.com/blog/2009/thats-not-a-memory-leak-its-bloat/)非常有用。 – kalusn 2011-03-16 12:39:14

+0

雖然問題仍然存在。我會嘗試和優化領域,如果我找到答案,回到這裏。 – kalusn 2011-03-16 13:27:03

回答

2

好吧,我猜這是我不得不自助的一種情況,我確實很高興我做到了。我沒有使用任何我鏈接到的工具。

我通過登錄我的服務器。 ssh並在兩個屏幕窗口中運行了兩個命令:top和tail -f /var/www/mysite.com/log/production.log。

我查看了實時日誌文件,發現需要花費很長時間才能加載的頁面請求 - 用戶可以顯示他/她的圖像的頁面,每個用戶都通過他們的名字標識。 acts_as_taggable_on。這個單個請求花了6秒鐘。

它不斷彈出。我想我已經看了6或7次,我決定進一步調查。它始終是相同的用戶ID,所以我決定查找用戶。事實證明,用戶有一個空白的名字,「」,並已標記的圖像是由

Asset.tagged_with(@user.name, :on => "users") 

現在,在我的應用程序中,有成千上萬的資產10S和Asset.tagged_with(「」: on =>「users」)會返回所有這些,從而吃掉我的記憶。

現在我已經處理了一個用戶有一個空白名稱的情況,並且它已經被所有新用戶需要。儘管沒有人提供幫助,但我仍然對stackoverflow感到有些感慨,因爲有時候就像問問題來解決問題一樣簡單。

+0

不錯的發現,我認爲沒有人能夠幫助你比你的「對牆說話」技術做得更好。如果您的數據庫支持CHECK約束,那麼我會爲此添加一個,並儘可能多地創建列。NOT NULL可用於額外的偏執狂:破碎的代碼很容易修復,破壞的數據不是那麼多。 – 2011-03-16 16:40:13