【问题标题】:Troubleshooting Heroku R14 & R15 memory errors on background process对后台进程上的 Heroku R14 和 R15 内存错误进行故障排除
【发布时间】:2018-01-18 00:59:30
【问题描述】:

我正在寻求解决一些 R14 和 R15 内存错误的帮助,我经常在 Heroku 上运行的 Rails 应用程序的日志中发现这些错误。

Jan 15 08:34:12 myapp-production app/worker.1:  2018-1-15T16:34:11+0000: [Worker(host:a833f658-b5 pid:4)] Job StoryAssetMailer#perform (id=7776) RUNNING 
Jan 15 08:36:31 myapp-production heroku/worker.1: Process running mem=518M(100.0%) 
Jan 15 08:36:31 myapp-production heroku/worker.1: Error R14 (Memory quota exceeded) 
Jan 15 08:36:33 myapp-production heroku/worker.1: Error R15 (Memory quota vastly exceeded)

我已经按照Heroku's R14 support 页面上的建议设置了WEB_CONCURRENCY=1。差别不大。

问题是我真的不知道使用什么工具来测量内存峰值(泄漏?)发生的位置?我可以找到有问题的方法(包括在下面),但正在寻找如何缩小问题的确切范围的想法,然后我会担心如何解决它。

后台进程创建错误是Job StoryAssetMailer#perform:

# app/jobs/story_asset_mailer.rb
require Rails.root.join('lib', 's3_store')
require 'zip'

class StoryAssetMailer
  def initialize(recipient:, story:)
    @recipient = recipient
    @story = story
  end

  def perform
    stored_file = S3Store.new(
      zip_file_stream,
      @story.download_safe_title(
        extension: 'zip'
      )
    ).store(method: :sysread)

    Mailer.story_images(
      recipient: @recipient,
      story: @story,
      file_url: stored_file.url
    ).deliver
  end

  def zip_file_stream
    manifest = ZipManifest.build(media_files_for_story)
    build_zip_file(manifest)
  end   
  ...
end

相关型号:

#app/models/zip_manifest.rb
require 'open-uri'

class ZipManifest
  def initialize(manifest: nil)
    @manifest ||= manifest
  end

  def each_file
    @manifest.each do |contents, filename|
      yield filename, contents
    end
  end

  def self.build(images)
    new(
      manifest:
        images.map do |image|
          [open(image.url), image.filename]
        end
    )
  end
end

编辑:这东西在吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 heroku memory-leaks background-process


    【解决方案1】:

    请仔细检查您的文件。因为 RAM 也会为您的文件分配内存。如果您的文件是 500M,那么总内存应该是(500M + 后台进程的内存)。

    【讨论】:

    • 我不确定你的意思?什么“文件”?您是在谈论在上述过程中创建的 zip 文件吗?如果是这样,我认为这并不重要,因为这个特定的 Zip 编码器将输出流式传输到文件中,并且不会将其保存在内存中……或者我是这么认为的。
    • 每次系统处理一个文件时,都会为该文件分配内存。通常,硬盘驱动程序包含此文件,但如果系统处理该文件,则需要从 RAM 分配内存。我曾经在 Rails 中遇到延迟工作的同样问题。但是,也许我错了,但这是我的建议。
    【解决方案2】:

    您可以使用https://devcenter.heroku.com/articles/log-runtime-metrics heroku 插件实时查看您的内存消耗。

    您的进程内存使用量直接取决于您正在处理的文件的大小以及您使用的是最小的测功机 (512Mb)。您可能希望扩大规模。

    另外,WEB_CONCURRENCY 通常用于控制 web dynos 并发,而不是 worker。

    R15 错误(大大超出配额)意味着您已超过 200% (https://devcenter.heroku.com/articles/error-codes#r15-memory-quota-vastly-exceeded),这会导致 heroku 终止进程。

    当您超过 100% 但低于 200% 的内存配额时,R14 错误(超出内存配额)是一个警告。它只会影响性能(测功机开始交换)。

    因此,请在您的应用中设置最大资产文件大小限制,并确保 asset file size + your app slug size + some safety margin 在您的测功机内存限制范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多