curl是一个非常好用的命令行工具,经常被用来测试网站能否正常访问、网站URL响应什么状态码,上传和下载文件,以及调试API接口等。在我的工作中,也是经常用到curl。
但curl的功能远不止如此,curl还能记录http请求的耗时时间,根据这些信息我们可以分析性能瓶颈,这也是本次关注的重点。
首先配置curl的输出格式,打开~/.curlrc,输入以下内容。
-w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttransfer: %{time_starttransfer} | total: %{time_total}\n"
curl输出格式详解。
time_namelookup:dns解析总共消耗的时间
time_connect:从开始dns解析到tcp建联成功之间总共消耗的时间
time_appconnect:从开始dns解析到ssl握手成功之间总共消耗的时间,以收到Finished包为准。
time_pretransfer:从开始dns解析到发起http请求之间总共消耗的时间
time_starttransfer:从开始dns请求到服务器响应首个字节之间总共消耗的时间
time_total:整个请求所消耗的时间,包含dns解析、tcp握手和ssl握手的时间
curl发起https请求,输出的内容是各阶段所消耗的时间,单位为秒。
root@k8s-master1:~# cat ~/.curlrc
-w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttransfer: %{time_starttransfer} | total: %{time_total}\n"
root@k8s-master1:~#
root@k8s-master1:~# curl -so /dev/null https://www.example.com
dnslookup: 1.510 | connect: 1.757 | appconnect: 2.256 | pretransfer: 2.259 | starttransfer: 2.506 | total: 3.001
root@k8s-master1:~#
看得出来时间是递增的,例如time_connect包含了time_namelookup,time_appconnect包含了time_connect。
time_namelookup是dns解析总共消耗的时间,跟服务器性能没啥关系。主要关注的是除了dns解析以外的耗时,根据上面的信息,各阶段的耗时都已经整理好了。
dns解析耗时:1.510s
tcp建联耗时:1.757s - 1.510s = 0.247s
ssl握手耗时:2.256s - 1.757s = 0.499s
http首包耗时:2.506s - 2.259s = 0.247s
http传输耗时:3.001s - 2.506s = 0.495s
http总共耗时:3.001s - 2.259s = 0.742s
总共3秒的请求,dns解析占用了50%,其他的耗时貌似也不太理想。
http首包耗时是客户端开始发起http请求(time_pretransfer)到服务器响应首个字节(time_starttransfer)之间总共消耗的时间,不包含tcp建立和ssl握手时间。
另外这是以客户端角度来统计的耗时,以服务器的角度统计的耗时可能稍微有些差距。