楔子:项目中往往时常会出现一些千奇百怪的问题,往往百思不解,防不胜防。那么我们静心而论,逐步分析,无所不用其极。Linux curl 命令也许是个分析当前网络状况和请求耗时的不错的工具。

Linux curl 命令

 

当基础服务的几个接口出现持续性变慢,而且这几个接口都消费了第三方服务提供的 REST API,也确定是在与第三方通信时导致耗时增加的,这显然十分影响性能。所以,这里使用 linux curl 命令分析当前网络情况和请求耗时,试图寻找问题节点。

 

Linux curl 命令提供了以下参数:

  • -w:它能够按照指定的格式打印某些信息,里面可以使用某些特定的变量,而且支持 \n 、 \t 和 \r 转义字符
  • -o /dev/null:把响应的内容丢弃,因为我们这里并不关心它,只关心请求的耗时情况
  • -s:不要打印进度条

 

案例1:curl -w 查看

curl -w "\n time_nslookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n http_code: %{http_code}\n " "http://www.taobao.com"

结果1:

从结果中可以看出,有些不必有的信息。

优化一下,给上述命令加上参数 -o /dev/nul,变成 curl -o /dev/null -w

如下案例2:

curl -o /dev/null -w "\n time_nslookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n http_code: %{http_code}\n " "http://www.taobao.com"

输出结果2:

这些变量都是什么意思呢?这里备注一下:

  • time_namelookup:DNS 解析域名的时间,就是把 http://www.taobao.com 转换成 IP 地址的过程的耗时
  • time_connect:TCP 连接建立的时间,就是三次握手的时间(client 和 server 端建立 TCP 连接的时间)
  • time_appconnect:SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
  • time_redirect:从开始到最后一个请求事务的时间
  • time_pretransfer:从请求开始到响应开始传输的时间
  • time_starttransfer:从发出请求到响应第一个字节的时间
  • time_total:此次请求花费的全部时间

这些时间是叠加的,比如 time_connect 里面包括 DNS 解析的时间,即包含 time_namelookup 耗时;time_appconnect 的耗时也包含了 time_connect 耗时,以此类推。

 

案例3:curl 发送带参 Post 请求:

curl -w "\n time_nslookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n http_code: %{http_code}\n " -H "Content-Type: application/json" -H "X-LC-Id: app id" -H "X-LC-Key: app master key,master" -X POST -d '{"from_client": "test", "message": "消息测试"}'  "https://tx0FisUk.api.lncld.net/1.2/rtm/conversations/converId/messages"

注意,如果要成功运行上述脚本,需要有正确的 app 信息来替代红色部分。

 time_nslookup: 0.069
 time_connect: 0.097
 time_appconnect: 1.175
 time_pretransfer: 1.175
 time_starttransfer: 1.215
 time_total: 1.215
 http_code: 200

由于 time_connect 变量表示 TCP 握手的耗时,time_appconnect 变量表示 SSL 握手的耗时:

  • HTTP 耗时 = TCP 握手
  • HTTPS 耗时 = TCP 握手 + SSL 握手

所以,通过 curl 命令进行网络耗时分析,time_appconnect 时间 1.175 减去 time_connect 时间 0.097,SSL 耗时 1.078 秒。这样可以明显看到 SSL 耗时过长,从而导致接口整体耗时过长。

 

怎么在本地 Windows 下跑 curl 命令呢?

首先需要确保本地 Windows 已经安装好 curl 命令包。下载地址:https://curl.haxx.se/windows

注意:直接拿 案例3 在 Windows 下跑,会报错:curl: (3) unmatched close brace/bracket in URL position 9

这里,需要把上述命令 -d 参数的引号变成三个引号后才可以在 Windows 下正常运行,如下:

curl -w "\n time_nslookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n http_code: %{http_code}\n " -H "Content-Type: application/json" -H "X-LC-Id: Fo2xO2tD20Y3FWM6dDiv5IGP-gzGzoHsz" -H "X-LC-Key: tN5MPIXpnpMuHODCSe53xB8T,master" -X POST -d "{"""from_client""": """S_1778c05281f04ed7bc91efd0c21abda96_test""", """message""": """消息测试"""}" "https://tx0FisUk.api.lncld.net/1.2/rtm/conversations/5cb99a7730863b00704b537e/messages"

运行成功~

同样也可以看到 SSL 耗时过长,从而导致接口整体耗时过长。

Logo

更多推荐