对后台进程上的 Heroku R14 和 R15 内存错误进行故障排除

Mel*_*emi 5 memory-leaks ruby-on-rails heroku background-process ruby-on-rails-4

我正在寻求帮助解决一些 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)
Run Code Online (Sandbox Code Playgroud)

我已按照Heroku 的 R14 支持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
Run Code Online (Sandbox Code Playgroud)

相关型号:

#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
Run Code Online (Sandbox Code Playgroud)

编辑:这个东西开了吗?

Wil*_*yen 3

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