我的 HTTP 请求的执行时间很长(例如,13 秒内执行了 42KB)。
我使用 haproxy 来平衡流量。静态文件由 lighttpd 在 varnish 加速器后面提供服务。所以...它应该在光速以下提供服务 :P
http://img580.imageshack.us/g/34411388.png/
长 DNS 查询:pic1
长接:图2
模拟下载:pic3
我使用 GoogleDNS。服务器位于美国。首先,我将 IP 添加到 /etc/hosts 以省略 DNS 查询。其次,我将静态迁移到单独的机器,省略了 haproxy。这样它就直接连接到 varnish。流量不大,因为这只是开发,但它也发生在生产中。
http://img580.imageshack.us/g/34411388.png/
修改后:图4
稍微好一点了,但还是很慢……
答案1
首先,您必须检查 Varnish 从哪里提供图像。它每次都是缓存图像还是使用后端?
您可以通过多种方式进行检查:
- 使用命令行开关来跟踪 VCL 并准确查看请求正在做什么(
-p vcl_trace=true
如果我的记忆力没问题的话)。 - 用于
varnishlog
观察对图像的某些请求并查看发生了什么(如果它是从缓存中提供的,等等)。如果您设置了 ,则必须使用此功能vcl_trace
。 - 在响应传递中添加一个标题,然后在浏览器上检查它以查看是否命中。
像这样:
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
unset resp.http.cookie;
} else {
set resp.http.X-Cache = "MISS";
}
}
它会在 Varnish 处理的每个请求上添加一个 X-cache 标头。在检查 Varnish 是否确实正确缓存后,我们可以查找响应时间过长的原因,但我想观察跟踪中的请求会给你一些提示。
答案2
你可能会被击中缓冲区膨胀。