【问题标题】:Heroku Slug Size After Multiple Deployments多次部署后的 Heroku Slug 大小
【发布时间】:2014-06-19 20:37:09
【问题描述】:

我有一个非常接近 slug 大小限制 (300mb) 的 Ruby on Rails 应用程序。我用.slugignore 尽可能地减小了尺寸,但没有得到我想要的结果。

一时兴起,我尝试创建一个新的 Heroku 应用程序并将相同的 git 存储库部署到它。瞧,它远低于(只有 80mb 与 208mb)。在访问 bash 并检查每台服务器上的大小时,我注意到服务器之间存在一些差异:

du -hs *
130M (old) vs 1.4M (new) public
23M (old) vs 5.3M (new) tmp
...

什么给了?在 Heroku 上,用户是否希望在通过足够多的部署后销毁和重新创建应用程序?我查看了公共目录,它保留了各种旧的已删除资产和垃圾。如何在不销毁现有应用的情况下从头开始清理现有应用?

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    这可能与 Rail 试图在部署期间避免问题有关。目标是避免部署期间的停机和/或错误。您的代码不会立即部署到所有服务器。 Rails 的解决方案是允许资产的多个版本同时存在。典型的流程是:

    %> rake assets:precompile  # To build new assets
    %> rake assets:clean       # Remove old assets
    

    Rails keeps 2 previous versions 的资产(默认情况下)。根据应用程序,您可能需要一段时间的旧资产。例如,如果您有一个繁重的 JavaScript 应用程序,它会一次性获取资源,然后通过 XHR 动态更新。在客户端运行的旧代码可能会引用其他旧资源。即使使用非客户端繁重的应用程序,您也可能有几秒钟的时间,其中一些节点引用旧资产,而另一些节点引用新资产。

    这可以解释为什么 public 在您的旧应用上较大。它本质上具有所有资产的三个版本,而您的新部署只有一个。听起来你的构建环境肯定有什么问题,因为即使你的所有资产都占用了新应用程序中的 1.4MB,该大小的三倍应该只有大约 5MB,而不是旧应用程序中的 130MB。

    除了你的assets有3个版本外,tmp目录下也有一些积累。资产编译过程会在 tmp 目录中缓存一些信息。 Rails 有一个rake tmp:cache:clear,你可以定期运行它来清除那里的垃圾。

    Heroku automatically runs rake assets:clean。所以这应该只保留三个版本的资产。但是 Heroku 实际上并没有运行 rake tmp:cache:clear。相反,他们have some custom code 删除缓存文件,直到缓存数据低于 50MB。我假设他们这样做是为了保留尽可能多的缓存信息,同时仍然限制内容。保留尽可能多的缓存数据可能会确保资产编译运行快速。这意味着您的 tmp 目录将继续增长,直到达到 50MB。

    如果您的 public/assets 目录超过了 3 个版本,或者 tmp 目录中的 50MB 太多了,那么创建一个新应用程序是一个不错的清理方法。你也可以create a custom slug。仅在 heroku 控制台上运行 rake assets:clean 或 rake tmp:cache:clear 是行不通的。那只会清理测功机上的东西,而不是你的蛞蝓。因此,当创建新的测功机时,您的清洁工作将被丢弃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2021-09-28
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多