curl -w 分段计时
curl 的写入模板能把一次请求拆成几个时间点:名称解析完成、传输层连接完成、加密握手完成、首个字节到达、整个请求结束。每个数值都是从请求发起算起的累计秒数,两个相邻值相减就得到该阶段自己花掉的时间。这样『打开慢』就不再是一句感受,而是一串能落到具体环节的数字:解析慢、连接慢、握手慢、服务端慢、还是传输慢。
基本信息
| 适用平台 | Linux、macOS、Windows 10 以上内置的 curl 均支持 |
|---|---|
| 核心写法 | curl -sS -o /dev/null -w '模板' URL,丢弃正文只留数字 |
| 常用变量 | 解析、连接、握手、首字节、总耗时、下载速率、下载字节数、响应码 |
| 使用要点 | 多次取样取中位数,单次结果受瞬时拥塞影响大 |
| 配套动作 | 先记数字再动手,改完后用同样命令复测对比 |
典型使用场景
- 用户抱怨页面慢:先量化各阶段耗时,判断是网络还是服务端问题
- 解析优化验证:调整解析服务后对比解析阶段耗时是否下降
- 跨地域访问评估:不同地域分别测量,比较连接与首字节耗时的差异
- 容量排查:传输阶段速率明显低于链路标称时,进一步检查丢包与窗口
- 上线前后对比:功能发布后复测同一目标,确认性能没有退化
分段计时
分段计时
curl -sS -o /dev/null -w '解析=%{time_namelookup}s 连接=%{time_connect}s 握手=%{time_appconnect}s 首字节=%{time_starttransfer}s 总计=%{time_total}s 状态=%{http_code}\n' https://example.com/
curl -sS -o /dev/null -w '大小=%{size_download}B 速率=%{speed_download}B/s 总计=%{time_total}s\n' https://example.com/static/big.bin
# 连续采样 5 次,去掉瞬时波动的影响:
for i in 1 2 3 4 5; do curl -sS -o /dev/null -w '%{time_total}\n' https://example.com/; done | sort -n | head -3变量与阶段换算
| 变量 | 含义 | 与前一阶段相减得到 |
|---|---|---|
| time_namelookup | 名称解析完成的时刻 | 解析本身耗时,正常在几十毫秒内 |
| time_connect | 传输层连接完成的时刻 | 连接耗时,约等于一个往返时间 |
| time_appconnect | 加密握手完成的时刻 | 握手耗时,通常一到两个往返时间 |
| time_starttransfer | 收到首个字节的时刻 | 服务端处理与排队耗时 |
| time_total | 请求全部结束的时刻 | 内容传输耗时,等于总量除以速率 |
| speed_download | 平均下载速率 | 与链路标称对比可判断是否被限速 |
分段看的是相对关系:连接耗时若远超一个往返时间,说明握手前有排队或丢包重传;首字节耗时远大于握手耗时,方向就转向服务端。
样本要成组:单次测量容易被瞬时拥塞、缓存命中与否、解析冷热影响,至少取五次并看中位数再下结论。
耗差异常与方向
| 异常表现 | 常见方向 | 下一步验证 |
|---|---|---|
| 解析阶段明显偏大 | 解析服务慢或链路绕行 | 单独对解析服务做查询计时 |
| 连接阶段远超一个往返 | 握手被丢包重传或存在排队 | 结合丢包统计与路径工具 |
| 握手阶段偏大 | 证书链拉取、协议协商开销 | 复用会话后复测对比 |
| 首字节阶段偏大 | 服务端排队、后端依赖慢 | 看服务端日志与后端依赖耗时 |
| 传输阶段速率偏低 | 丢包导致降速或带宽受限 | 用吞吐工具实测并与链路标称对比 |
把测量结果与往返时延基线换算再判断:跨地域访问时几十毫秒的连接耗时可能完全正常,只看绝对值容易误判。
测量时忘记丢弃正文,下载内容会混进输出干扰读数;同时注意本机代理与缓存对结果的影响,必要时分别做直连与经代理的对照。