我打算使用延迟作业来运行一些背景分析。在我最初的测试中,我看到了大量的内存使用情况,所以我基本上创建了一个非常简单的任务,每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