0

最近出现了一个非常糟糕的问题。我的 Rails (3.2.12) 开始服务资产的速度非常缓慢。未修改的资产需要整整一秒钟才能返回 304。总页面加载时间约为 20 秒:

"GET / HTTP/1.1" 304 - 13.5556
"GET /application.css HTTP/1.1" 304 - 0.8758
"GET /bootstrap.css HTTP/1.1" 304 - 1.5164
"GET /printing.css HTTP/1.1" 304 - 0.8421
"GET /application.js HTTP/1.1" 200 1335651 

从历史上看,该应用程序从未如此缓慢。

相同资产的后续重新加载仍需要半秒以上

"GET /pages/logo-white-topbar.png HTTP/1.1" 200 785 1.0668
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.6074
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.5951
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.6449
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.6031

关于这个问题的一些奇怪的事情:

  • 我的同事都没有遇到过这个问题。我们有一些开发人员在处理这个代码库,没有人遇到这个问题。(所以这不是代码中的问题)
  • 我们的 Rails 应用程序代码库包含引擎的源代码。其他应用程序共享该引擎。当其他应用程序指向引擎的来源时,它们并不慢。

所以我尝试了一切,从最简单的开始,越来越难:

  • 打开/关闭资产管道、资产调试等...
  • git bisect 回到六月
  • 从 Gemfile 中取出一切可能
  • 从 Ruby 1.9.2 升级到 1.9.3
  • 重建所有宝石
  • 重建 Ruby 1.9.3
  • 卸载并重新安装rvm
  • 通过优化重建 Ruby 1.9.3

没有任何效果。一切都很缓慢。

最后我吹走了我的项目目录并重新克隆了应用程序。我运行它并且资产在合理的时间内服务。

"GET /pages/logo-white-topbar.png HTTP/1.1" 200 2267 0.2029
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.1827
"GET /pages/logo-white-topbar.png HTTP/1.1" 304 - 0.1822

我的意思是,我们并没有在这里点燃世界,但这是一个巨大的进步。页面加载从 20 秒变为 4 秒。

我的旧目录和新克隆的目录唯一不同的是我在旧目录中有 69 个 git 分支。很明显,我应该把它们清理干净。大多数已完全合并,但有些只是长期运行的功能分支。

我的问题是:这是一个合法的问题吗?拥有 70 个分支机构真的会压垮资产管道的性能吗?这是为什么?我的 .git 不知何故笨拙吗?我显然对 git 了解得不够多,无法处理这个问题。

这是 OSX 10.8.4 上的 git 1.8.1.2

谢谢。

更新:Rein 认为 git 是一条红鲱鱼的建议让我窥探其他罪魁祸首。原来我的日志目录已经膨胀到巨大的大小。我把它吹走了,但它没有任何区别。外部资产(例如来自 mixpanel)在 24 毫秒内提供服务是荒谬的,但我的本地机器需要 1000 毫秒才能在一个小 js 文件上提供 304。

更新 2: .git/objects/pack在慢速 repo 中为 104MB,即使在运行git gc新克隆的 repo 有 20MBpack文件夹并且没有松散对象之后,该目录也有大量松散文件。

4

1 回答 1

4

这几乎可以肯定是一个红鲱鱼。

一个 git 分支实际上只不过是一个 41 字节的文件.git/refs/heads,我看不出有任何可能的方式表明该文件的存在会导致这个问题。

资产管道根本不知道您的项目是否使用 git,因此它不会在幕后进行任何 git 操作。

尝试复制原始 git repo 并删除所有分支,看看这是否真的改变了性能。

于 2013-08-07T00:42:19.117 回答