1

我将 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 -c10 https://example.com/foo.jpg

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

更新 我不知道我以前怎么没想到这一点,但我的基准确实是最大化我的互联网连接。如果我使用 robots.txt 而不是 jpg 进行相同的测试,我会得到 20 个请求/秒(并且仍然在下游最大)。

4

1 回答 1

2

我注意到您帖子中的 URL 是 HTTPS。我在使用基于主机名的 SSL 的 cedar 堆栈上遇到问题,即使日志显示队列时间为 0 毫秒且服务时间为 5-10 毫秒,某些请求(针对静态资产和其他)也会遇到高延迟。这是 Heroku 的支持响应(他没有提到的是 varnish 不会缓存来自 cedar 应用程序的资源,尽管它在运行基于主机名的 SSL 时存在于堆栈中):

我们不完全确定是什么原因造成的,但我们怀疑 Varnish 是罪魁祸首。通常,对于 Cedar 堆栈,清漆不存在。但是,当使用 SSL 主机名插件时,Varnish 会重新添加到响应过程中。无需同时使用 Rack::Cache 和 Varnish。

我想建议从图片中删除清漆,看看它是否有帮助。实现这一点的方法是将 SSL 移动到我们的新 SSL 附加组件 SSL Endpoint。SSL 端点在技术上仍处于测试阶段,但它很快就会普遍可用,并且成本与 SSL 主机名相同。这是 Heroku 上 SSL 的未来,而且在各个方面都更好。

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

移动的缺点是您必须更新 DNS,但一旦完成,Varnish 将不复存在,我们将能够更好地了解这是否是问题所在。

我们还考虑了您当前的 SSL 终端节点(Amazon ELB)出现问题并需要更换的可能性。但如果是这种情况,许多请求会很慢或失败,而不仅仅是随机的单个缓慢请求。更换当前的 ELB 也将涉及 DNS 更改。迁移到新的 SSL 端点插件将使这种情况在未来变得更容易 - 如果需要更换 ELB,则不需要更改 DNS。

目前,我认为最好迁移到 SSL Endpoint。

诚然,我看到的延迟有时会达到 30-60 秒的范围,这显然比你看到的要糟糕得多。当我在我的一些(HTTPS)雪松应用程序上对静态资产运行相同的 apache bench 命令时,我并没有做得更好(10-15 req/s)。当我将并发增加到 50 或 100 时,RPS 会上升到 30。但是,在 Varnish 前端的竹 HTTPS 应用程序上,我可以将静态资产的请求数提高到 50 个以上。如果我的计算机可以处理更高的并发性,我怀疑它会更高。而且我的互联网连接延迟很高,因为它位于蜂窝网络上。

于 2012-04-02T01:30:26.107 回答