curl -w参数说明

curl 命令提供了 -w 参数,允许按照指定的格式打印与请求相关的信息,其中部分信息可以通过特定的变量表示,如 status_code、size_download、time_namelookup 等等。由于我们关注的是耗时分析,因此只需关注与请求延迟相关的变量(以 time_ 开头的变量)。各个阶段的耗时变量如下所示:

$ cat curl-format.txt
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
      time_redirect:  %{time_redirect}\n
   time_pretransfer:  %{time_pretransfer}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n

curl 内部延迟变量

变量名称 说明
time_namelookup 从请求开始到域名解析完成的时间
time_connect 从请求开始到 TCP 三次握手完成的时间
time_appconnect 从请求开始到 TLS 握手完成的时间
time_pretransfer 从请求开始到发送第一个 GET/POST 请求的时间
time_redirect 重定向过程的总时间,包括 DNS 解析、TCP 连接和内容传输前的时间
time_starttransfer 从请求开始到首个字节接收的时间
time_total 请求总耗时

示例

$ curl -w "@curl-format.txt" -o /dev/null -s 'https://github.com'
    time_namelookup:  0.000017
       time_connect:  0.000061
    time_appconnect:  1.882753
      time_redirect:  0.000000
   time_pretransfer:  1.882799
 time_starttransfer:  1.948631
                    ----------
         time_total:  2.070605

HTTPS 请求各阶段耗时计算

耗时 说明
域名解析耗时 = time_namelookup 从发起请求到获取域名对应的 IP 地址(DNS 解析成功)的时间
TCP 握手耗时 = time_connect - time_namelookup 建立 TCP 连接所需的时间
SSL 耗时 = time_appconnect - time_connect TLS 握手及加解密处理时间
服务器处理请求耗时 = time_total - time_starttransfer 服务器处理请求的时间
TTFB = time_starttransfer 从请求开始到接收服务器首个字节的时间
总耗时 = time_total 整个 HTTPS 的请求耗时