Linux书签(04)用linux curl命令分析当前网络情况和请求耗时
楔子:项目中往往时常会出现一些千奇百怪的问题,往往百思不解,防不胜防。那么我们静心而论,逐步分析,无所不用其极。Linux curl命令也许是个分析当前网络状况和请求耗时的不错的工具。Linux curl 命令当基础服务的几个接口出现持续性变慢,而且这几个接口都消费了第三方服务提供的 REST API,也确定是在与第三方通信时导致耗时增加的,这显然十分影响性能。所以,这里使用 ...
楔子:项目中往往时常会出现一些千奇百怪的问题,往往百思不解,防不胜防。那么我们静心而论,逐步分析,无所不用其极。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 耗时过长,从而导致接口整体耗时过长。
更多推荐
所有评论(0)