我打算使用延遲作業來運行一些背景分析。在我最初的測試中,我看到了大量的內存使用情況,所以我基本上創建了一個非常簡單的任務,每2分鐘運行一次,以觀察正在使用多少內存。高內存使用率
該任務非常簡單,analytics_eligbile?方法總是返回false,給定數據現在的位置,所以基本上沒有任何重擊命令被調用。我在開發中的示例數據中有大約200篇文章。發佈has_one analytics_facet。
無論這裏的內部邏輯/業務如何,這項任務所做的唯一事情就是調用analytics_eligible?方法每2分鐘200次。在4小時內,我的物理內存使用量爲110MB,虛擬內存爲200MB。只是爲了做一些簡單的事情!我甚至無法想象,如果在具有實際生產數據的10,000個帖子上執行實際的分析,它將會佔用多少內存!當然,它可能不會運行2分鐘,更像每30分鐘,但我不認爲它會飛。
這是在Ubuntu 10.x 64位上運行ruby 1.9.7,rails 2.3.5。我的筆記本電腦有4GB內存,雙核心CPU。
是軌道真的這麼糟糕還是我做錯了什麼?
Delayed::Worker.logger.info('RAM USAGE Job Start: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Post.not_expired.each do |p|
if p.analytics_eligible?
#this method is never called
Post.find_for_analytics_update(p.id).update_analytics
end
end
Delayed::Worker.logger.info('RAM USAGE Job End: ' + `pmap #{Process.pid} | tail -1`[10,40].strip)
Delayed::Job.enqueue PeriodicAnalyticsJob.new(), 0, 2.minutes.from_now
日誌模型
def analytics_eligible?
vf = self.analytics_facet
if self.total_ratings > 0 && vf.nil?
return true
elsif !vf.nil? && vf.last_update_tv > 0
ratio = self.total_ratings/vf.last_update_tv
if (ratio - 1) >= Constants::FACET_UPDATE_ELIGIBILITY_DELTA
return true
end
end
return false
end
我唯一要補充的是這個優秀的答案是任何Rails進程都會消耗很多內存 - 你的110mb並不少見。這並不代表你的代碼中有內存泄漏,或者你做了多少處理。處理1000條記錄或10M條記錄將使用相同數量的內存(如果你已經做好了正確的處理)(克里斯解釋過的方式)。 – wuputah 2010-08-28 01:52:04