我正在使用delayed_job来处理heroku的后台作业.偶尔我会超越我的内存分配,我会得到这样的东西:
2011-11-16T02:41:25 00:00 heroku [worker.1]:错误R14(超出内存配额)
2011-11-16T02:41:45 00:00 heroku [worker.1]:正在运行的进程mem = 542M(106.0%)
我想优雅地处理这个问题.有没有办法找出我何时要超越我的记忆限制?
像rack-timeout这样的东西会很棒
谢谢!
解决方法
我认为通过窃取
Oink gem中的一些代码,我找到了一个很好的解决方案.特别是这个文件:
memory_snapshot.rb,你应该阅读.它概述了四种不同的方法来消除内存使用
因此无法在Rack级别上进行此操作,您需要在导致内存问题的进程中添加内存检查(在我的情况下,它正在构建一个csv文件).
所以在那个循环中它看起来像:
def build_string_io(collection) csv_io = StringIO.new csv_io << collection.first.to_comma_headers.join(',') + "\n" collection.each do |imp| csv_io << imp.to_comma.join(',') + "\n" check_memory! end csv_io.rewind csv_io end def check_memory! raise 'AboutToRunOutOfMemory' if memory > 400.megabytes #Or whatever size your worried about end # Taken from Oink def memory pages = File.read("/proc/self/statm") pages.to_i * self.class.statm_page_size end def self.statm_page_size @statm_page_size ||= begin sys_call = SystemCall.execute("getconf PAGESIZE") if sys_call.success? sys_call.stdout.strip.to_i / 1024 else 4 end end end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。