使用curl命令分析请求的耗时情况

最近工作中遇到一个问题,某个请求的响应特别慢,因此我就希望有一种方法能够分析到底请求的哪一步耗时比较长,好进一步找到问题的原因。在网络上搜索了一下,发现了一个非常好用的方法, curl 命令就能帮你分析请求的各个部分耗时。

curl 命令提供了 -w 参数,这个参数在 manpage 是这样解释的:


  1. -w, --write-out  
  2. Make curl display information on stdout after a completed transfer. The format is a string that may contain plain text mixed with any number of variables. The format 
  3. can be specified as a literal "string", or you can have curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write 
  4. "@-". 
  5. The variables present in the output format will be substituted by the value or text that curl thinks fit, as described below. All variables are specified as %{vari‐ 
  6. able_name} and to output a normal % you just write them as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t. 

它能够按照指定的格式打印某些信息,里面可以使用某些特定的变量,而且支持 \n 、 \t 和 \r 转义字符。提供的变量很多,比如
status_code 、 local_port 、 size_download 等等,这篇文章我们只关注和请求时间有关的变量(以 time_
开头的变量)。

先往文本文件 curl-format.txt 写入下面的内容:


  1.  ~ cat curl-format.txt  
  2. time_namelookup: %{time_namelookup}\n 
  3. time_connect: %{time_connect}\n  
  4. time_appconnect: %{time_appconnect}\n  
  5. time_redirect: %{time_redirect}\n  
  6. time_pretransfer: %{time_pretransfer}\n  
  7. time_starttransfer: %{time_starttransfer}\n  
  8. ----------\n 
  9. time_total: %{time_total}\n 

那么这些变量都是什么意思呢?我解释一下:

  • time_namelookup :DNS 域名解析的时候,就是把 https://zhihu.com 转换成 ip 地址的过程
  • time_connect :TCP 连接建立的时间,就是三次握手的时间
  • time_appconnect :SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
  • time_redirect :从开始到最后一个请求事务的时间
  • time_pretransfer :从请求开始到响应开始传输的时间
  • time_starttransfer :从请求开始到第一个字节将要传输的时间
  • time_total :这次请求花费的全部时间

我们先看看一个简单的请求,没有重定向,也没有 SSL 协议的时间:


  1.  ~ curl -w "@curl-format.txt" -o /dev/null -s -L "http://cizixs.com"  
  2. time_namelookup: 0.012  
  3. time_connect: 0.227  
  4. time_appconnect: 0.000  
  5. time_redirect: 0.000  
  6. time_pretransfer: 0.227  
  7. time_starttransfer: 0.443  
  8. ----------  
  9. time_total: 0.867 

可以看到这次请求各个步骤的时间都打印出来了,每个数字的单位都是秒(seconds),这样可以分析哪一步比较耗时,方便定位问题。这个命令各个参数的意义:

  • -w :从文件中读取要打印信息的格式
  • -o /dev/null :把响应的内容丢弃,因为我们这里并不关心它,只关心请求的耗时情况
  • -s :不要打印进度条

从这个输出,我们可以算出各个步骤的时间:

  • DNS 查询:12ms
  • TCP 连接时间:pretransfter(227) - namelookup(12) = 215ms
  • 服务器处理时间:starttransfter(443) - pretransfer(227) = 216ms
  • 内容传输时间:total(867) - starttransfer(443) = 424ms

来个比较复杂的,访问某度首页,带有中间有重定向和 SSL 协议:


  1.  ~ curl -w "@curl-format.txt" -o /dev/null -s -L "https://baidu.com"  
  2. time_namelookup: 0.012  
  3. time_connect: 0.018  
  4. time_appconnect: 0.328  
  5. time_redirect: 0.356  
  6. time_pretransfer: 0.018  
  7. time_starttransfer: 0.027  
  8. ----------  
  9. time_total: 0.384 

可以看到 time_appconnect 和 time_redirect 都不是 0 了,其中 SSL 协议处理时间为 328-18=310ms 。而且 pretransfer 和 starttransfer 的时间都缩短了,这是重定向之后请求的时间。

作者:佚名

来源:51CTO

时间: 2024-09-21 20:59:17

使用curl命令分析请求的耗时情况的相关文章

使用Curl命令查看请求响应时间方法_javascript技巧

curl命令查看请求响应时间 # curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" http://www.36nu.com 0.014::0.015::0.018::0.019::1516256.00 -o:把curl 返回的html.js 写到垃圾回收站[ /dev/null] -s:去掉所有状

curl命令常见用法汇总 good

  curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面. curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服务器获取数据.他支持很多的传输协议,尤其是HTTP/HTTPS以及其他诸如FTP/FTPS, RTSP, POP3/POP3S, SCP, IMAP/IMAPS协议等.当你使用curl向一个URL发送HTTP请求的时候,它会使用一个默认只包含必要的头部字段(如:User-Agent, Host, and

curl 命令使用

原文地址:http://blog.sina.com.cn/s/blog_4b9eab320100slyw.html 可以看作命令行浏览器 1.开启gzip请求curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte 2.监控网页的响应时间curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer

Linux系统中的curl命令使用教程

  命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. 语法:# curl [option] [url] 常见参数: -A/--user-agent 设置用户代理发送给服务器 -b/--cookie -c/--cookie-jar 操作结束后把cookie写入到这个文件中 -C/--continue-at 断点续转 -D/--dump-heade

php使用curl获取https请求的方法

 这篇文章主要介绍了php使用curl获取https请求的方法,涉及curl针对https请求的操作技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php使用curl获取https请求的方法.分享给大家供大家参考.具体分析如下: 今日在做一个项目,需要curl获取第三方的API,对方的API是https方式的. 之前使用curl能获取http请求,但今天获取https请求时,出现了以下的错误提示:证书验证失败. SSL certificate problem, verify

PHP CURL 执行 Authorization 请求的例子

PHP CURL 扩展可以帮助我们快速实现HTTP请求. 在使用豆瓣OAuth登录接口时,我们需要发送这样的HTTP REQUEST 请求:  代码如下 复制代码     GET /v2/user/~me HTTP/1.1     Host: https://api.douban.com     Authorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4 在命令行中我们这样执行:  代码如下 复制代码     curl "https://api.

php使用curl获取https请求的方法_php技巧

本文实例讲述了php使用curl获取https请求的方法.分享给大家供大家参考.具体分析如下: 今日在做一个项目,需要curl获取第三方的API,对方的API是https方式的. 之前使用curl能获取http请求,但今天获取https请求时,出现了以下的错误提示:证书验证失败. SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_

linux curl命令详解及实例分享_Linux

linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具. 一,curl命令参数,有好多我没有用过,也不知道翻译的对不对,如果有误的地方,还请指正. -a/--append 上传文件时,附加到目标文件 -A/--user-agent <string>  设置用户代理发送给服务器 - anyauth   可以使用"任何"身份验证方法 -b/--cookie <name=string

CURL HTTP构造请求Header实现伪造来源IP的说明

CURL HTTP构造请求Header实现伪造来源IP的说明 伪造的只是X-FORWARDED-FOR和CLIENT-IP,REMOTE_ADDR伪造不了. $_SERVER['REMOTE_ADDR']是由nginx传递给php的参数,就代表了与当前nginx直接通信的客户端的 IP(是不能伪造的) PHP获取客户端IP,代理服务器IP,共有如下几类情况: 一.没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP HTTP_VIA = 没数值或不显示 HTTP_X_FORWARD