生产环境中 AWS S3 上的 Carrierwave 导致 Ruby on Rails 内存泄漏

问题描述 投票:0回答:1

我使用 Starter 计划(0.5 CPU / 512 MB)在 Render 上部署了一个简单的 Rails API 映像。

User
模型有一个
picture
字段,该字段是由
carrierwave
托管的字段,托管在 AWS S3 上。

每当我的应用程序调用 API 来检索

User
模型及其关联图片(4 kB)时,我的服务器都会使用所有可用的内存。如果事后推送更多请求,有时会崩溃。这种情况发生在正确完成检索用户的请求之后。在此图中,我们可以看到它的使用率从大约 75% 上升到 100%,因此在本例中,请求的使用量约为 120Mb。

enter image description here

这是我的 Carrierwave 配置:

CarrierWave.configure do |config|
  if Rails.env.development?
    config.storage = :file
    config.asset_host = 'http://localhost:3000'
  else
    config.storage    = :aws
    config.aws_bucket = "#{ENV.fetch('S3_BUCKET_NAME')}-#{Rails.env}"
    config.aws_acl    = 'private'

    config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7

    config.aws_attributes = -> { {
      expires: 1.week.from_now.httpdate,
      cache_control: 'max-age=604800'
    } }

    config.aws_credentials = {
      access_key_id:     ENV.fetch('AWS_ACCESS_KEY_ID'),
      secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
      region:            ENV.fetch('AWS_REGION'), # Required
      stub_responses:    Rails.env.test?
    }
  end
end

development
环境(使用 S3 托管资产)本地运行相同的容器时,内存使用量保持稳定。但每当我切换到
production
时,内存使用量就会像渲染一样增加。我还尝试在具有
carrierwave
环境的本地容器中使用
:file
production
模式(因此没有 S3),并且内存使用量不会增加。

知道这可能与什么有关吗?我研究了

carrierwave-aws
gem 问题,但没有找到任何东西......

ruby-on-rails amazon-s3 carrierwave
1个回答
0
投票

我最终切换到

fog
来处理 S3 存储,我的应用程序的内存使用情况再次稳定了 🎉

© www.soinside.com 2019 - 2024. All rights reserved.