我想知道如今ESI模块的性能如何?我已经在网上阅读了一些帖子,其中说 Varnish 的ESI性能实际上比真实的要慢。

假设我的页面包含超过3500个esi,这将如何执行?是专为这种用途设计的吗?

最佳答案

我们正在使用Varnish和ESI将子文档嵌入到JSON文档中。基本上,来自我们的应用服务器的响应如下所示:

[
  <esi:include src="/station/best_of_80s" />,
  <esi:include src="/station/herrmerktradio" />,
  <esi:include src="/station/bluesclub" />,
  <esi:include src="/station/jazzloft" />,
  <esi:include src="/station/jahfari" />,
  <esi:include src="/station/maximix" />,
  <esi:include src="/station/ondalatina" />,
  <esi:include src="/station/deepgroove" />,
  <esi:include src="/station/germanyfm" />,
  <esi:include src="/station/alternativeworld" />
]

所包含的资源本身就是完整且有效的JSON响应。所有工作站的完整列表大约是1070。因此,当缓存很冷并且完整的工作站列表是第一个请求时, Varnish 在我们的后端发出1000个请求。当缓存很热时,ab看起来像这样:
$ ab -c 100 -n 1000 http://127.0.0.1/stations
[...]

Document Path:          /stations
Document Length:        2207910 bytes

Concurrency Level:      100
Time taken for tests:   10.075 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      2208412000 bytes
HTML transferred:       2207910000 bytes
Requests per second:    99.26 [#/sec] (mean)
Time per request:       1007.470 [ms] (mean)
Time per request:       10.075 [ms] (mean, across all concurrent requests)
Transfer rate:          214066.18 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1   11   7.3      9      37
Processing:   466  971  97.4    951    1226
Waiting:        0   20  16.6     12      86
Total:        471  982  98.0    960    1230

Percentage of the requests served within a certain time (ms)
  50%    960
  66%    985
  75%    986
  80%    988
  90%   1141
  95%   1163
  98%   1221
  99%   1229
 100%   1230 (longest request)
$

100 rec/sec看起来不太好,但要考虑文档的大小。 214066KB/s很好地饱和了1Gbit接口(interface)。

具有热缓存ab(ab -c 1 -n 1 ...)的单个请求显示为83ms/req。

后端本身是基于Redis的。我们在NewRelic中测量的平均响应时间为0.9ms [sic]。重新启动Varnish后,第一个具有冷高速缓存的请求(ab -c 1 -n 1 ...)显示3158ms/rec。这意味着生成响应时需要使用Varnish,我们的后端每个ESI大约需要3毫秒。这是具有8个核心的标准核心i7披萨盒。我在满负荷的情况下进行了测量。这样,我们每月提供约150mio req的数据,命中率为0.9。这些数字确实表明,ESI-includes是按顺序解析的。

设计这样的系统时,您需要考虑的因素是:1)当缓存处于冷态时,在Varnish重新启动后,后端能够承担负载; 2)通常您的资源不会一次全部耗尽。如果是我们的电台,它们每隔一小时就会到期,但我们会在到期 header 中添加最多120秒的随机值。

希望能有所帮助。

关于caching - Varnish 和ESI的性能如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5960598/

10-13 09:15