使用 curl 命令分析网站请求耗时

在进行网站性能优化或网络故障排查时,了解请求各环节的耗时至关重要。curl 命令提供了强大的 -w (write-out) 参数,允许用户自定义输出格式,从而精确分析 DNS 解析、TCP 连接、SSL 握手及内容传输等阶段的时间消耗。

方法一:使用格式文件

为了获得更清晰的可读性,建议将输出格式定义在一个单独的文件中。

1. 执行命令

curl -w "@curl-format.txt" -o /dev/null -s -L "https://www.jd.com"

2. 格式文件内容

创建名为 curl-format.txt 的文件,内容如下:

# 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

3. 参数含义说明

  • time_namelookup:DNS 解析耗时。
  • time_connect:TCP 连接建立耗时(包含三次握手)。
  • time_appconnect:SSL/SSH 等上层协议连接建立耗时(如 SSL 握手)。
  • time_redirect:重定向耗时(包含所有重定向请求的时间)。
  • time_pretransfer:从请求开始到即将传输第一个字节前的总耗时(包含 SSL 握手等)。
  • time_starttransfer:从请求开始到第一个字节即将传输的时间(包含服务器处理时间)。
  • time_total:本次请求花费的总时间。

示例输出与耗时分析

1. 命令执行结果

# curl -w "@curl-format.txt" -o /dev/null -s -L "https://www.jd.com"
   time_namelookup:  0.529108
      time_connect:  0.688685
   time_appconnect:  1.201098
     time_redirect:  0.000000
  time_pretransfer:  1.201304
time_starttransfer:  1.418342
                    ----------
time_total:  1.540865

2. 关键阶段耗时计算

基于上述输出,可以计算出各个网络阶段的具体耗时:

  • DNS 查询时间0.529108
  • TCP 连接时间time_connect - time_namelookup

    • 计算:0.688685 - 0.529108 = 0.159577 (约 159ms)
  • 服务器处理时间time_starttransfer - time_pretransfer

    • 计算:1.418342 - 1.201304 = 0.217038 (约 217ms)
  • 内容传输时间time_total - time_starttransfer

    • 计算:1.540865 - 1.418342 = 0.122523 (约 122ms)

方法二:命令行直接指定格式

如果不希望创建额外的格式文件,也可以直接在命令行中通过 -w 参数指定输出格式。

# curl -w "%{time_namelookup}\n%{time_connect}\n%{time_pretransfer}\n%{time_starttransfer}\n%{time_total}" -o /dev/null -s -L "https://www.jd.com"    
0.014314
0.018578
0.044222
0.293051
0.701479
说明:以上命令适用于大多数 Linux 及 macOS 环境下的 curl 版本。Windows 用户若使用 PowerShell 或 CMD,可能需要注意引号转义或换行符的差异。具体可用变量请参考本地 man curl 文档。