Heroku静态资产服务问题与Sinatra?

时间:2012-02-17 07:05:13

标签: optimization heroku sinatra assets

我们的代码库中有一个非常大的应用程序,其中包含大量的骨干代码...显然,加载100个左右的js文件对来自Heroku的HTTP请求造成很大压力,我们决定将它们打包以加快速度。我们决定使用sinatra-assetpack gem来压缩和打包它们,以减少整体大小和HTTP请求。令人惊讶的是,即使我们节省了大量空间并将HTTP请求数量减少了近100个,但我们在Heroku中的日志在GET请求中显示服务器时间增加了!

我很难理解为什么会发生这种情况,但这是一个快速的打印输出:

Before assetpack:
heroku[router]: GET xxxx dyno=web.5 queue=0 wait=0ms service=888ms status=200 bytes=35726

After assetpack:
heroku[router]: GET xxxx dyno=web.6 queue=0 wait=0ms service=1862ms status=200 bytes=30103

请求的大小减少了15%,而服务时间增加了一倍以上。这是怎么回事?

编辑:我应该提一下资产包在部署时构建压缩版本,然后从内存中提供服务......也许这会产生影响吗?

1 个答案:

答案 0 :(得分:2)

编辑:

我想我明白了。当你有一个正在睡觉的heroku应用程序 - 所有免费应用程序都会睡眠,除非在使用中 - 它需要Heroku大约一秒左右来启动应用程序。这就是你开机860毫秒的原因。然后,当您添加资产管理器时,它有很多工作要做,因此需要更多时间。您需要连续10次命中它以查看速度的变化。

例如,我的应用程序的初始命中需要860ms,但第二次,第三次等调用大约需要5ms。

老想法:

'在部署时构建压缩版本' - 即使它正常工作,您也会为运行的每个版本的应用程序(每个dyno)或更多版本进行部署 - 如果应用程序因其他原因需要重新启动,例如崩溃,等

另一个想法:文档说'heroku支持'无论那意味着什么。但他们也谈到了“缓存破坏” - 如果你的应用程序的每个dyno对缓存破坏特殊数字有什么不同的想法怎么办 - 所以dyno#1说特殊#是892094.js,而dyno#2说928449。 js,因为dynos是随机分配的 - 你有捶打。