找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3834

积分

0

好友

532

主题
发表于 前天 19:42 | 查看: 11| 回复: 0

很多工程师每天都在用 curl。但 90% 的人只会用最基础的一种方式

curl https://example.com

然而 curl 其实隐藏着一个 非常强大的能力

一条命令直接分析 HTTP 请求的整个生命周期。

比如:

curl -o /dev/null -s -w "DNS: %{time_namelookup}s
TCP: %{time_connect}s
TLS: %{time_appconnect}s
TTFB: %{time_starttransfer}s
TOTAL: %{time_total}s" https://example.com

输出:

DNS: 0.002s
TCP: 0.015s
TLS: 0.120s
TTFB: 0.180s
TOTAL: 0.300s

一眼就能看出:

  • DNS 是否慢
  • TCP 是否慢
  • TLS 是否慢
  • 服务器是否慢

这就是 curl最被低估的参数之一

-w  (--write-out)

今天这篇文章,带你彻底掌握它。


一、为什么工程师需要 curl -w?

很多线上问题,本质都是网络链路问题

例如:

用户请求慢
   │
   ├─ DNS 慢
   ├─ TCP 连接慢
   ├─ TLS 握手慢
   ├─ 服务器处理慢
   └─ 下载慢

如果没有合适的工具,你通常只能靠猜:

  • 是DNS问题?
  • 是网络问题?
  • 是服务器慢?
  • 还是 CDN 问题?

curl -w 可以直接打印 完整网络阶段时间线,将黑盒变成白盒,这正是高效网络诊断的关键。


二、curl -w 是什么

-w 全称:

--write-out

它的作用是:

在请求完成后,输出自定义的 HTTP 请求统计信息。

语法:

curl -w "<format>" URL

例如,只想看HTTP状态码:

curl -w "%{http_code}\n" https://example.com

输出:

200

三、HTTP 请求完整时间线

理解 curl -w 之前,我们需要先理清 HTTP 请求的完整流程

客户端
  │
  │ DNS lookup
  ▼
解析 IP
  │
  │ TCP connect
  ▼
建立连接
  │
  │ TLS handshake
  ▼
建立 HTTPS
  │
  │ send request
  ▼
服务器处理
  │
  │ first byte
  ▼
开始返回数据
  │
  ▼
下载完成

curl -w 的强大之处,就在于它可以精确测量并打印出每一个阶段所花费的时间


四、最常用的 10 个变量

下表列出了工程师最常使用的 -w 变量:

变量 含义
%{http_code} HTTP 状态码
%{time_total} 总耗时
%{time_namelookup} DNS 解析时间
%{time_connect} TCP 连接时间
%{time_appconnect} TLS 握手时间
%{time_pretransfer} 准备传输时间
%{time_starttransfer} 首字节时间(TTFB)
%{size_download} 下载字节数
%{speed_download} 下载速度
%{remote_ip} 服务器 IP

五、工程师最常用的性能分析命令

这是 最值得收藏并投入实战的一条命令

curl -o /dev/null -s -w "DNS: %{time_namelookup}s
TCP: %{time_connect}s
TLS: %{time_appconnect}s
TTFB: %{time_starttransfer}s
TOTAL: %{time_total}s" https://example.com

输出示例:

DNS: 0.002s
TCP: 0.015s
TLS: 0.120s
TTFB: 0.180s
TOTAL: 0.300s

这条命令清晰地勾勒出了请求的时间线:

DNS lookup
   │
   ▼
TCP connect
   │
   ▼
TLS handshake
   │
   ▼
Server processing
   │
   ▼
First byte
   │
   ▼
Download finished

六、5 个非常实用的 curl -w 用法

1. 打印 HTTP 状态码

curl -o /dev/null -s -w "%{http_code}\n" URL

适合场景

  • API 健康检查
  • 自动化脚本中的条件判断

2. 查看接口总延迟

curl -o /dev/null -s -w "%{time_total}\n" URL

输出:

0.231

3. 状态码 + 延迟(一站式检查)

curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" URL

输出:

200 0.231s

4. 查看真实服务器 IP

有时候经过 CDN 或负载均衡器,真实的服务器 IP 会被隐藏。用这个命令可以看清:

curl -s -o /dev/null -w "%{remote_ip}\n" URL

输出:

104.18.12.123

5. 查看下载速度

curl -o /dev/null -s -w "%{speed_download}\n" URL

输出:

234512

单位是 bytes/s。


七、排查慢接口的标准套路

如果你发现请求很慢,比如:

TOTAL: 2.3s

这时就可以用前面提到的“黄金命令”进行分段定位:

异常指标 可能的问题
DNS 时间 (time_namelookup) 高 DNS 解析慢
TCP 时间 (time_connect) 高 网络延迟高或防火墙问题
TLS 时间 (time_appconnect) 高 TLS 握手慢(证书复杂或服务器性能)
TTFB 时间 (time_starttransfer) 高 服务器处理慢(应用逻辑或数据库慢)

案例分析
假设命令输出如下:

DNS: 0.002
TCP: 0.010
TLS: 0.090
TTFB: 1.800
TOTAL: 2.000

结论一目了然:瓶颈在于服务器处理环节(TTFB 高达 1.8 秒),而非网络层面。


八、生产环境监控脚本

许多简单的服务监控,其核心就是一个加强版的 curl -w 命令。你可以这样构建一个监控点:

curl -o /dev/null -s -w \
"status=%{http_code} time=%{time_total}\n" \
https://api.example.com

输出:

status=200 time=0.123

将这个脚本与 crontabPrometheus 或现有的日志系统结合,就能轻松实现对关键接口的 SLA 与性能监控。这正是一个经典且高效的运维监控实践。


九、curl -w 的隐藏能力

很多人可能不知道:

curl -w 可以输出 超过 40 个不同的统计变量

除了常用的时间、状态码,你还可以获取:

  • remote_port
  • num_redirects (重定向次数)
  • size_upload (上传数据量)
  • ssl_verify_result (SSL证书验证结果)
  • ...等等

查看所有可用变量的终极方法是查阅手册:

man curl

然后在手册中搜索 --write-out 部分。


总结

curl -w 本质上是一个 轻量级、零依赖的 HTTP 请求可观测性工具

它让 curl 从一个简单的数据下载工具,进化成了:

  • API 调试工具:快速检查状态和延迟。
  • 网络分析工具:精准定位 DNS、TCP、TLS 各阶段问题。
  • 性能诊断工具:量化分析服务器响应时间。

掌握它,意味着你多了一种快速洞察网络请求内部状态的能力,下次再遇到“请求慢”的问题时,就不用再盲目猜测了。

延伸阅读(以下为原文外链):




上一篇:技能手套众包数据,具身智能创企Sunday获1.65亿美元融资
下一篇:Node.js异步错误处理实战:try/catch防崩溃指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-17 16:32 , Processed in 0.465569 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表