2012-04-01 81 views
1

我的Rack :: Cache被设置为堆栈中最顶层的(最后一个)中间件。我的应用程序托管在heroku雪松上,因此Rack :: Cache也负责静态资产。Rack :: Cache的性能不佳

它是由Heroku的memcached的产品支持,并配置是这样的:

config.action_dispatch.rack_cache = { 
    :metastore => Dalli::Client.new, 
    :entitystore => 'file:tmp/cache/rack/body', 
    :allow_reload => false 
} 
config.static_cache_control = "public, max-age=2592000" 

它薄运行。

我使用ab测试映像文件的性能。在我的日志

ab -n100 -c10 https://example.com/foo.jpg

来看,所有的请求都缓存命中( “新鲜”)。但是性能很差,只有大约6个请求/秒。我知道Rack :: Cache的性能不如专用的http代理,但我当然期望比这更高的吞吐量。

更新 我不知道我以前没怎么想过,但我的基准确实超出了我的互联网连接。如果我使用robots.txt而不是jpg来做同样的测试,我会得到20个请求/秒(并且仍然是最大的下游)。

+0

你可以使用Rack :: Cache进行测试吗?没有给我们结果吗? – 2012-04-01 19:36:45

+0

很好的问题。没有Rack :: Cache,它是3请求/秒。 – 2012-04-01 21:38:37

回答

2

我注意到您帖子中的网址是HTTPS。我在基于主机名的SSL的雪松堆栈上遇到了一个问题,即某些请求(对于静态资产和其他请求)都会经历高延迟,即使日志表示队列时间为0毫秒,服务时间为5-10毫秒。这是Heroku的支持响应(他没有提到的是清漆不会缓存来自雪松应用程序的资源,尽管它在运行基于主机名的SSL时出现在堆栈中):

我们不是完全确定是什么造成了这一点,但我们怀疑光油 是责任。通常情况下,在Cedar堆叠中,Varnish不存在。 但是,当使用SSL主机名加载项时,清漆会被添加回 的响应过程中。没有必要同时使用Rack :: Cache和 光油。

我想建议从图片中删除清漆,看它是否可以帮助。做到这一点的方法是将SSL移动到我们的新SSL加载项SSL 端点。 SSL Endpoint在技术上仍处于测试阶段,但它很快就会推出,并且其价格与SSL主机名相同。 这是Heroku未来的SSL,在各方面都更好。

http://devcenter.heroku.com/articles/ssl-endpoint-beta2
用户:公测 通:* ***

的缺点感动的是,你必须更新DNS,但一旦这样做 ,清漆会出来的图片我们将能够更好地了解它是否是问题。

我们还考虑过您当前的SSL端点 Amazon ELB不好并需要更换的可能性。但是,如果这是 的情况下,许多请求会很慢或失败,不只是一个随机的 单缓慢的请求。更换当前的ELB还将涉及DNS更改 。转移到新的SSL端点附加组件将使未来的这种情况更容易 - 如果交换ELB为 ,则不需要DNS更改。

现在,我认为移动到SSL端点将是最好的。

当然,我看到的延迟有时会进入30-60 SECOND范围,这显然比你看到的要差很多。当我在我的一些(HTTPS)雪松应用程序上针对静态资产运行相同的Apache Bench命令时,我并没有做得更好(10-15 req/s)。当我将并发性提高到50或100时,RPS最多可达30个。但是,在光滑的竹HTTPS应用中,我可以将静态资产的请求量提高到50个/秒以上。如果我的电脑可以处理更高的并发性,我怀疑它会更高。而且我的互联网连接因为在蜂窝网络上而具有高延迟。

+0

史诗般的答案!即时通讯使用端点SSL,所以怪异的清漆层不是问题。你的比较基准有点让人放心,也许有更高的并发性,然后我可以在本地观察。幸运的是,我的绝大多数资产都在cdn上。 – 2012-04-02 02:53:29

+0

也看到我上面的更新 – 2012-04-02 19:03:50