接口响应慢?教你一招用 curl 秒判是“网络锅”还是“后端锅”

Frieren 发布于 2026-02-02 52 次阅读


在日常开发中,我们常遇到接口响应慢的情况。一旦慢下来,前端说是后端的锅,后端说是网络的锅,运维说是数据库的锅……

这时候,我们需要一个客观的证据来判断到底慢在哪里。

我们要把一个 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 命令看看慢在路上还是慢在家里!

此作者没有提供个人介绍。
最后更新于 2026-02-02