在日常开发中,我们常遇到接口响应慢的情况。一旦慢下来,前端说是后端的锅,后端说是网络的锅,运维说是数据库的锅……
这时候,我们需要一个客观的证据来判断到底慢在哪里。
我们要把一个 HTTP 请求的生命周期拆解为 4 个关键阶段:
[ DNS解析 ] → [ TCP建连 ] → [ 服务端处理 ] → [ 内容传输 ]
接下来,我们将使用 Linux 神器 curl 来精准定位时间损耗。
一、 核心概念:这三个指标代表什么?
在开始诊断前,我们需要理解三个关键的“检查点”:
1. DNS (Name Lookup)
- 含义:将
www.example.com翻译成 IP 地址93.184.216.34的过程。 - 诊断:如果这一步耗时久,说明是本地 DNS 配置或DNS 服务器的问题,和后端代码无关。
2. TCP (Connection)
- 含义:客户端与服务器建立 TCP 握手(三次握手)的过程。
- 诊断:如果这一步慢,可能是网络延迟高、防火墙阻塞或服务端负载过高导致无法及时响应握手。
3. TTFB (Time To First Byte)
- 含义:从请求发出,到客户端收到服务端发来的第一个字节所经历的时间。
- 关键点:这是判断后端性能的最核心指标。
- 诊断:如果 DNS 和 TCP 很快,但 TTFB 很慢,说明请求已经到了服务端,是后端程序处理业务逻辑(查库、运算、调用第三方)太慢了。
二、 诊断工具:一条 curl 命令
我们可以利用 curl 的 -w (write-out) 参数来打印各个阶段的耗时。
1. 魔法命令
为了方便阅读,我们可以将格式化字符串直接写在命令中:
Bash
curl -o /dev/null -s -w "
=========== Metric ===========
DNS Lookup : %{time_namelookup} s
TCP Connect : %{time_connect} s
TTFB (Start) : %{time_starttransfer} s
Total Time : %{time_total} s
==============================
\n" https://www.bilibili.com/
2. 参数解析
-o /dev/null:把响应内容丢弃,我们只关心时间,不关心网页内容。-s:Silent 模式,不输出进度条和错误信息。-w "...":按照我们指定的格式输出统计信息。
三、 实战分析:如何读懂数据?
注意:curl 返回的时间通常是“从开始到该节点结束”的累积时间。 因此,要计算某个阶段的独立耗时,通常需要做减法。
假设我们执行命令后得到以下输出(以你的 Bilibili 请求为例):
Plaintext
DNS Lookup : 0.000033 s
TCP Connect : 0.000779 s
TTFB (Start) : 0.357295 s
Total Time : 0.357358 s
1. 阶段耗时计算(毫秒级拆解)
- DNS 耗时 =
time_namelookup- 0.033 ms (极快,因为通常有本地缓存)
- TCP 建连耗时 =
time_connect-time_namelookup- 0.779ms - 0.033ms = 0.746 ms (网络状况极佳)
- 后端处理耗时 (Server Wait) =
time_starttransfer-time_connect- 357.295ms - 0.779ms ≈ 356.5 ms
- 注:这里包含了极少量的请求发送时间,但绝大部分是服务器在思考的时间。
- 内容传输耗时 (Download) =
time_total-time_starttransfer- 357.358ms - 357.295ms = 0.063 ms (只传了点头部信息,极快)
2. 结论判定
通过上述计算,我们可以得出清晰的结论:
- DNS/TCP 耗时均在 1ms 以下,说明网络链路非常通畅。
- 后端处理 耗时约为 356ms,占了总耗时的 99%。
- 判定:瓶颈在服务端处理(或者 Bilibili 正在做复杂的鉴权/渲染计算)。
四、 总结:排查速查表
拿到 curl 的数据后,可以对照下表快速定责:
| 慢在哪个指标? | 哪里出了问题? | 嫌疑对象 |
| DNS Lookup | 找不到地址 | 本地 DNS 设置、运营商 DNS |
| TCP - DNS | 建连慢 | 网络波动、服务器防火墙、TCP 队列满 |
| TTFB - TCP | 服务端在思考 | 后端代码、数据库查询、RPC 调用 |
| Total - TTFB | 下载慢 | 响应体过大(没开 gzip?)、带宽不足 |
下次遇到接口慢,别急着看代码,先丢一条 curl 命令看看慢在路上还是慢在家里!
Comments NOTHING