如何测量 TTFB
TTFB 从 HTTP 客户端开始发起请求时计时,到收到首个响应字节时结束。这个字节通常属于状态行或响应头。TTFB 包括请求传到服务器、在服务器端等待和处理,以及响应传回客户端所需的时间。
计时范围取决于所用工具。浏览器 Resource Timing 通常以 requestStart 到 responseStart 作为计时区间。curl 的 time_starttransfer 从传输开始时计时,因此可能包含 DNS 查询、TCP 建连和 TLS 握手时间。比较结果时,应记录所用工具以及是否复用了连接。
哪些因素会影响 TTFB
- **网络路径:**客户端、中间节点与服务器之间的距离、拥塞和路由会增加延迟。
- **连接建立:**需要新建连接时,DNS 查询、TCP 建连和 TLS 握手都会增加耗时。
- **服务器处理:**数据库查询缓慢、应用服务器过载和页面未缓存都会延迟响应。
- **中间节点:**负载均衡器、代理或 CDN 可能增加处理时间,也可能通过就近提供缓存内容来缩短 TTFB。
TTFB、延迟与页面加载时间的区别
TTFB 与网络延迟有部分重叠,但也包含服务器的初始处理时间。它不衡量完整响应下载完毕需要多长时间。
| 指标 | 计时终点 | 主要衡量内容 |
|---|---|---|
| TTFB | 收到首个响应字节 | 网络耗时及服务器初始处理时间 |
| 延迟 | 数据包到达目标端或返回 | 网络延迟 |
| 页面加载时间 | 页面加载完成或达到可用状态 | TTFB、下载和渲染时间 |
即使页面的 TTFB 很低,也可能因图片较大、带宽有限或 JavaScript 负载较重而加载缓慢。
通过代理检查 TTFB
代理服务器会增加一段从客户端到代理的路径,还必须将请求转发给网站。因此,代理的出口地区、连接复用情况和负载都可能改变 TTFB。
curl -sS -o /dev/null -w 'direct: %{time_starttransfer}s\n' https://example.com
curl -sS -o /dev/null -x http://USERNAME:PASSWORD@HOST:PORT -w 'proxy: %{time_starttransfer}s\n' https://example.com
应多次测试并比较中位数,不要只看单次结果。测试时应固定目标、HTTP 版本和连接复用策略,并记录代理的出口地区。
常见问题
什么样的 TTFB 算好?
这取决于端点、客户端地区和连接状态。应先为每个地区和页面类型建立基准,再排查持续高于基准的情况,而不是依赖统一的阈值。
TTFB 和 ping 一样吗?
不一样。ping 使用 ICMP 测量网络往返时间;TTFB 衡量一次 HTTP 交互,还包括服务器的初始处理时间。
代理一定会增加 TTFB 吗?
不一定。不过,正向代理通常会增加一些开销,因为流量需要多经过一段路径。反向代理或附近的 CDN 如果能返回缓存响应,反而可以缩短 TTFB。