Ruby on rails 使用Rack::Cache时性能不佳

Ruby on rails 使用Rack::Cache时性能不佳,ruby-on-rails,ruby,heroku,rack-cache,Ruby On Rails,Ruby,Heroku,Rack Cache,我将Rack::Cache设置为堆栈中最顶层(最后一个)的中间件。我的应用程序托管在heroku cedar上,所以Rack::Cache也负责静态资产 它由heroku memcached产品支持,配置如下: config.action_dispatch.rack_cache = { :metastore => Dalli::Client.new, :entitystore => 'file:tmp/cache/rack/body', :allow_reload

我将Rack::Cache设置为堆栈中最顶层(最后一个)的中间件。我的应用程序托管在heroku cedar上,所以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-c10https://example.com/foo.jpg

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

更新
我不知道我以前怎么没有想到这一点,但我的基准测试确实是最大限度地利用了我的互联网连接。如果我用robots.txt而不是jpg做同样的测试,我每秒会收到20个请求(下游仍然最多)。

我注意到你文章中的URL是HTTPS。我在使用基于主机名的SSL的cedar堆栈上遇到了一个问题,其中某些请求(对于静态资产和其他资产)将经历高延迟,即使日志中说队列时间为0毫秒,服务时间为5-10毫秒。以下是Heroku的支持回应(他没有提到的是varnish不会缓存来自cedar应用程序的资源,尽管它在运行基于主机名的SSL时存在于堆栈中):

我们不完全确定是什么原因导致了这一点,但我们怀疑 这是罪魁祸首。通常,对于雪松堆,不存在清漆。 但是当使用SSL主机名附加组件时,清漆会添加回 反应过程。不需要同时使用Rack::Cache和 清漆

我想建议把画上的清漆去掉,看看它是否有光泽 有帮助。实现这一点的方法是将SSL移动到新的SSL附加组件SSL 终点。SSL端点在技术上仍处于测试阶段,但将是 很快就可以普遍使用,其成本与SSL主机名相同。 这是Heroku上SSL的未来,它在各个方面都更好


用户:beta 通过:***

移动的缺点是您必须更新DNS,但一旦更新成功 完成后,清漆将从图片中消失,我们将能够得到一个 更好地了解这是否是问题所在

我们还考虑了您当前的SSL端点 亚马逊ELB,是坏的,需要更换。但如果这是最重要的 在这种情况下,许多请求会很慢或失败,而不仅仅是随机的 单个慢速请求。替换当前的ELB还需要一个 DNS更改。移动到新的SSL端点附加组件将使 这样的情况在未来更容易发生-如果更换出ELB是可行的 必要的DNS更改将不需要

目前,我认为转移到SSL端点将是最好的


当然,我看到的延迟有时会达到30-60秒的范围,这显然比你看到的要糟糕得多。当我在我的一些(HTTPS)cedar应用程序上对静态资产运行相同的apache bench命令时,我没有做得更好(10-15 req/s)。当我将并发性增加到50或100时,RPS将增加到30。然而,在清漆封面的竹HTTPS应用程序上,我可以为一个静态资产设置超过50个请求/秒的请求。如果我的计算机能够处理更高的并发性,我怀疑它会变得更高。我的互联网连接是高延迟的,因为它在蜂窝网络上。

你能用Rack::Cache和不使用Rack::Cache进行测试并给出结果吗?好问题。如果没有机架::缓存,则为3个请求/秒。epic应答!我使用端点SSL,所以奇怪的清漆层不是问题。您的比较基准有些令人放心,可能有更高的并发性可用,我可以在本地观察到。幸运的是,我的绝大多数资产都在cdn上。