Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cURL一次测量请求和响应时间?_Curl_Time_Upload_Download_Measure - Fatal编程技术网

如何使用cURL一次测量请求和响应时间?

如何使用cURL一次测量请求和响应时间?,curl,time,upload,download,measure,Curl,Time,Upload,Download,Measure,我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者 我想使用cURL测量请求、响应和总时间 我的示例请求如下所示: curl -X POST -d @file server:port 我目前在Linux中使用time命令来测量这一点: time curl -X POST -d @file server:port 虽然time命令只测量总时间,但这并不是我想要的 是否有任何方法可以使用cURL测量请求和响应时间?以下是答案: curl -X POST -d @fil

我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者

我想使用
cURL
测量请求、响应和总时间

我的示例请求如下所示:

curl -X POST -d @file server:port
我目前在Linux中使用
time
命令来测量这一点:

time curl -X POST -d @file server:port
虽然time命令只测量总时间,但这并不是我想要的

是否有任何方法可以使用
cURL
测量请求和响应时间?

以下是答案:

curl -X POST -d @file server:port -w %{time_connect}:%{time_starttransfer}:%{time_total}
-w
一起使用的所有变量都可以在这篇精彩的博文的
man curl

中找到

cURL支持格式化输出以获取请求的详细信息(请参见
-w,–write out
)。出于我们的目的,我们将只关注所提供的时间细节。以下时间以秒为单位

  • 创建一个新文件curl-format.txt,然后粘贴到:

         time_namelookup:  %{time_namelookup}s\n
            time_connect:  %{time_connect}s\n
         time_appconnect:  %{time_appconnect}s\n
        time_pretransfer:  %{time_pretransfer}s\n
           time_redirect:  %{time_redirect}s\n
      time_starttransfer:  %{time_starttransfer}s\n
                         ----------\n
              time_total:  %{time_total}s\n
    
     curl -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"
    
  • 提出请求:

         time_namelookup:  %{time_namelookup}s\n
            time_connect:  %{time_connect}s\n
         time_appconnect:  %{time_appconnect}s\n
        time_pretransfer:  %{time_pretransfer}s\n
           time_redirect:  %{time_redirect}s\n
      time_starttransfer:  %{time_starttransfer}s\n
                         ----------\n
              time_total:  %{time_total}s\n
    
     curl -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"
    
  • 或者在Windows上,它是

        curl -w "@curl-format.txt" -o NUL -s "http://wordpress.com/"
    

    它的作用是:
    -w“@curl format.txt”
    告诉curl使用我们的格式文件
    -o/dev/null
    将请求的输出重定向到/dev/null
    -s
    告诉cURL不要显示进度表
    ”http://wordpress.com/“
    我们正在请求的URL。如果URL有“&”查询字符串参数,请特别使用引号


    以下是您得到的反馈:
    创建Linux/Mac快捷方式(别名) 然后你可以直接打电话给

    curltime wordpress.org
    
    curltime wordpress.org
    
    感谢评论员皮特·道尔


    制作一个Linux/Mac独立脚本 此脚本不需要单独的.txt文件来包含格式

    在可执行路径中的某个位置创建一个新文件curltime,然后粘贴到:

    #/bin/bash
    
    curl-w@--o/dev/null-s“$@”选项1。要测量
    总时间

    curl -o /dev/null -s -w 'Total: %{time_total}s\n'  https://www.google.com
    
    curl -o /dev/null -s -w 'Establish Connection: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n'  https://www.google.com
    
    样本输出:

    选项2。获取
    建立连接的时间
    到第一个字节的时间(TTFB)
    总时间

    curl -o /dev/null -s -w 'Total: %{time_total}s\n'  https://www.google.com
    
    curl -o /dev/null -s -w 'Establish Connection: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n'  https://www.google.com
    
    样本输出:


    参考:

    根据此处的其他答案,您可以添加到.bashrc等的快捷方式:

    function perf {
      curl -o /dev/null -s -w "%{time_connect} + %{time_starttransfer} = %{time_total}\n" "$1"
    }
    
    用法:

    > perf stackoverflow.com
    0.521 + 0.686 = 1.290
    

    我制作了一个友好的格式化程序来嗅探curl请求,以帮助调试(参见注释了解用法)。它包含您可以以易于阅读的格式写出的所有已知输出参数


    如果要分析或总结延迟,可以尝试apache bench:

    ab -n [number of samples] [url]
    
    例如:

    ab -n 100 http://www.google.com/
    
    它将显示:

    This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking www.google.com (be patient).....done
    
    
    Server Software:        gws
    Server Hostname:        www.google.com
    Server Port:            80
    
    Document Path:          /
    Document Length:        12419 bytes
    
    Concurrency Level:      1
    Time taken for tests:   10.700 seconds
    Complete requests:      100
    Failed requests:        97
       (Connect: 0, Receive: 0, Length: 97, Exceptions: 0)
    Total transferred:      1331107 bytes
    HTML transferred:       1268293 bytes
    Requests per second:    9.35 [#/sec] (mean)
    Time per request:       107.004 [ms] (mean)
    Time per request:       107.004 [ms] (mean, across all concurrent requests)
    Transfer rate:          121.48 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:       20   22   0.8     22      26
    Processing:    59   85 108.7     68     911
    Waiting:       59   85 108.7     67     910
    Total:         80  107 108.8     90     932
    
    Percentage of the requests served within a certain time (ms)
      50%     90
      66%     91
      75%     93
      80%     95
      90%    105
      95%    111
      98%    773
      99%    932
     100%    932 (longest request)
    
    这是ApacheBench,2.3版
    版权1996亚当·特维斯,宙斯科技有限公司,http://www.zeustech.net/
    授权给Apache软件基金会,http://www.apache.org/
    基准测试www.google.com(耐心等待)…完成
    服务器软件:gws
    服务器主机名:www.google.com
    服务器端口:80
    文档路径:/
    文件长度:12419字节
    并发级别:1
    测试时间:10.700秒
    完成申请:100
    失败的请求:97
    (连接:0,接收:0,长度:97,异常:0)
    传输总量:1331107字节
    传输的HTML:1268293字节
    每秒请求数:9.35[#秒](平均值)
    每次请求的时间:107.004[ms](平均值)
    每个请求的时间:107.004[ms](所有并发请求的平均值)
    传输速率:接收到121.48[千字节/秒]
    连接时间(毫秒)
    最小平均值[+/-sd]最大中值
    连接:20 22 0.8 22 26
    处理:5985108.768911
    轮候人数:5985108.767910
    总数:80107108.890932
    在特定时间内服务的请求百分比(毫秒)
    50%     90
    66%     91
    75%     93
    80%     95
    90%    105
    95%    111
    98%    773
    99%    932
    100%932(最长请求)
    
    Hey比Apache Bench更好,SSL问题更少

    ./hey https://google.com -more
    Summary:
      Total:    3.0960 secs
      Slowest:  1.6052 secs
      Fastest:  0.4063 secs
      Average:  0.6773 secs
      Requests/sec: 64.5992
    
    Response time histogram:
      0.406 [1] |
      0.526 [142]   |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
      0.646 [1] |
      0.766 [6] |∎∎
      0.886 [0] |
      1.006 [0] |
      1.126 [0] |
      1.246 [12]    |∎∎∎
      1.365 [32]    |∎∎∎∎∎∎∎∎∎
      1.485 [5] |∎
      1.605 [1] |
    
    Latency distribution:
      10% in 0.4265 secs
      25% in 0.4505 secs
      50% in 0.4838 secs
      75% in 1.2181 secs
      90% in 1.2869 secs
      95% in 1.3384 secs
      99% in 1.4085 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:    0.1150 secs, 0.0000 secs, 0.4849 secs
      DNS-lookup:    0.0032 secs, 0.0000 secs, 0.0319 secs
      req write:     0.0001 secs, 0.0000 secs, 0.0007 secs
      resp wait:     0.2068 secs, 0.1690 secs, 0.4906 secs
      resp read:     0.0117 secs, 0.0011 secs, 0.2375 secs
    
    Status code distribution:
      [200] 200 responses
    
    工具书类

    以下是西蒙的答案的启发。它是自包含的(不需要单独的格式文件),因此非常适合包含在
    .bashrc

    curl_time(){
    curl-so/dev/null-w“\
    namelookup:%{time\u namelookup}s\n\
    连接:%{time\u connect}s\n\
    appconnect:%{time\u appconnect}s\n\
    预传输:%{time\u pretransfer}s\n\
    重定向:%{time\u redirect}s\n\
    starttransfer:%{time\u starttransfer}s\n\
    -------------------------\n\
    总计:%{time\u total}s\n“$@”
    }
    
    此外,它还应该适用于
    curl
    通常使用的所有参数,因为
    “$@”
    只是传递它们。例如,您可以执行以下操作:

    curl_time-X POST-H“内容类型:application/json”-d'{“key”:“val”}”https://postman-echo.com/post
    
    输出:

    namelookup:0125000s
    连接:02500000s
    应用连接:0609000S
    预转移:0609000s
    重定向:0000000秒
    开始传输:0719000S
    -------------------------
    总数:0719000
    
    这里有一个Bash-one-liner可以重复攻击同一台服务器:

    for i in {1..1000}; do curl -s -o /dev/null -w "%{time_total}\n" http://server/get_things; done
    

    就命令行而言,另一个可能是最简单的选项是添加内置的
    --trace time
    选项:

    curl -X POST -d @file server:port --trace-time
    
    尽管它在技术上不输出OP请求的各个步骤的计时,但它确实显示请求的所有步骤的时间戳,如下所示。使用这个,你可以(相当容易地)计算出每一步所花的时间

    $ curl https://www.google.com --trace-time -v -o /dev/null
    13:29:11.148734 * Rebuilt URL to: https://www.google.com/
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     013:29:11.149958 *   Trying 172.217.20.36...
    13:29:11.149993 * TCP_NODELAY set
    13:29:11.163177 * Connected to www.google.com (172.217.20.36) port 443 (#0)
    13:29:11.164768 * ALPN, offering h2
    13:29:11.164804 * ALPN, offering http/1.1
    13:29:11.164833 * successfully set certificate verify locations:
    13:29:11.164863 *   CAfile: none
      CApath: /etc/ssl/certs
    13:29:11.165046 } [5 bytes data]
    13:29:11.165099 * (304) (OUT), TLS handshake, Client hello (1):
    13:29:11.165128 } [512 bytes data]
    13:29:11.189518 * (304) (IN), TLS handshake, Server hello (2):
    13:29:11.189537 { [100 bytes data]
    13:29:11.189628 * TLSv1.2 (IN), TLS handshake, Certificate (11):
    13:29:11.189658 { [2104 bytes data]
    13:29:11.190243 * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    13:29:11.190277 { [115 bytes data]
    13:29:11.190507 * TLSv1.2 (IN), TLS handshake, Server finished (14):
    13:29:11.190539 { [4 bytes data]
    13:29:11.190770 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    13:29:11.190797 } [37 bytes data]
    13:29:11.190890 * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
    13:29:11.190915 } [1 bytes data]
    13:29:11.191023 * TLSv1.2 (OUT), TLS handshake, Finished (20):
    13:29:11.191053 } [16 bytes data]
    13:29:11.204324 * TLSv1.2 (IN), TLS handshake, Finished (20):
    13:29:11.204358 { [16 bytes data]
    13:29:11.204417 * SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305
    13:29:11.204451 * ALPN, server accepted to use h2
    13:29:11.204483 * Server certificate:
    13:29:11.204520 *  subject: C=US; ST=California; L=Mountain View; O=Google LLC; CN=www.google.com
    13:29:11.204555 *  start date: Oct  2 07:29:00 2018 GMT
    13:29:11.204585 *  expire date: Dec 25 07:29:00 2018 GMT
    13:29:11.204623 *  subjectAltName: host "www.google.com" matched cert's "www.google.com"
    13:29:11.204663 *  issuer: C=US; O=Google Trust Services; CN=Google Internet Authority G3
    13:29:11.204701 *  SSL certificate verify ok.
    13:29:11.204754 * Using HTTP2, server supports multi-use
    13:29:11.204795 * Connection state changed (HTTP/2 confirmed)
    13:29:11.204840 * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
    13:29:11.204881 } [5 bytes data]
    13:29:11.204983 * Using Stream ID: 1 (easy handle 0x55846ef24520)
    13:29:11.205034 } [5 bytes data]
    13:29:11.205104 > GET / HTTP/2
    13:29:11.205104 > Host: www.google.com
    13:29:11.205104 > User-Agent: curl/7.61.0
    13:29:11.205104 > Accept: */*
    13:29:11.205104 > 
    13:29:11.218116 { [5 bytes data]
    13:29:11.218173 * Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
    13:29:11.218211 } [5 bytes data]
    13:29:11.251936 < HTTP/2 200 
    13:29:11.251962 < date: Fri, 19 Oct 2018 10:29:11 GMT
    13:29:11.251998 < expires: -1
    13:29:11.252046 < cache-control: private, max-age=0
    13:29:11.252085 < content-type: text/html; charset=ISO-8859-1
    13:29:11.252119 < p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
    13:29:11.252160 < server: gws
    13:29:11.252198 < x-xss-protection: 1; mode=block
    13:29:11.252228 < x-frame-options: SAMEORIGIN
    13:29:11.252262 < set-cookie: 1P_JAR=2018-10-19-10; expires=Sun, 18-Nov-2018 10:29:11 GMT; path=/; domain=.google.com
    13:29:11.252297 < set-cookie: NID=141=pzXxp1jrJmLwFVl9bLMPFdGCtG8ySQKxB2rlDWgerrKJeXxfdmB1HhJ1UXzX-OaFQcnR1A9LKYxi__PWMigjMBQHmI3xkU53LI_TsYRbkMNJNdxs-caQQ7fEcDGE694S; expires=Sat, 20-Apr-2019 10:29:11 GMT; path=/; domain=.google.com; HttpOnly
    13:29:11.252336 < alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
    13:29:11.252368 < accept-ranges: none
    13:29:11.252408 < vary: Accept-Encoding
    13:29:11.252438 < 
    13:29:11.252473 { [5 bytes data]
    100 12215    0 12215    0     0   112k      0 --:--:-- --:--:-- --:--:--  112k
    13:29:11.255674 * Connection #0 to host www.google.com left intact
    
    $curlhttps://www.google.com --跟踪时间-v-o/dev/null
    13:29:11.148734*重建URL至:https://www.google.com/
    %总接收百分比%x平均速度时间电流
    数据加载上载总左速度
    0 0 0 0 0 0 0--:-:-:-:-:-:-:-:---:---013:29:11.149958*正在尝试172.217.20.36。。。
    13:29:11.149993*TC
    
    -w "\n\n==== cURL measurements stats ====\ntotal: %{time_total} seconds \nsize: %{size_download} bytes \ndnslookup: %{time_namelookup} seconds \nconnect: %{time_connect} seconds \nappconnect: %{time_appconnect} seconds \nredirect: %{time_redirect} seconds \npretransfer: %{time_pretransfer} seconds \nstarttransfer: %{time_starttransfer} seconds \ndownloadspeed: %{speed_download} byte/sec \nuploadspeed: %{speed_upload} byte/sec \n\n"
    
    ❯❯ curl -I https://google.com
    HTTP/2 301
    location: https://www.google.com/
    content-type: text/html; charset=UTF-8
    date: Mon, 04 Mar 2019 08:02:43 GMT
    expires: Wed, 03 Apr 2019 08:02:43 GMT
    cache-control: public, max-age=2592000
    server: gws
    content-length: 220
    x-xss-protection: 1; mode=block
    x-frame-options: SAMEORIGIN
    alt-svc: quic=":443"; ma=2592000; v="44,43,39"
    
    
    
    ==== cURL measurements stats ====
    total: 0.211117 seconds
    size: 0 bytes
    dnslookup: 0.067179 seconds
    connect: 0.098817 seconds
    appconnect: 0.176232 seconds
    redirect: 0.000000 seconds
    pretransfer: 0.176438 seconds
    starttransfer: 0.209634 seconds
    downloadspeed: 0.000 byte/sec
    uploadspeed: 0.000 byte/sec
    
    {"contentType":"%{content_type}","filenameEffective":"%{filename_effective}","ftpEntryPath":"%{ftp_entry_path}","httpCode":"%{http_code}","httpConnect":"%{http_connect}","httpVersion":"%{http_version}","localIp":"%{local_ip}","localPort":"%{local_port}","numConnects":"%{num_connects}","numRedirects":"%{num_redirects}","proxySslVerifyResult":"%{proxy_ssl_verify_result}","redirectUrl":"%{redirect_url}","remoteIp":"%{remote_ip}","remotePort":"%{remote_port}","scheme":"%{scheme}","size":{"download":"%{size_download}","header":"%{size_header}","request":"%{size_request}","upload":"%{size_upload}"},"speed":{"download":"%{speed_download}","upload":"%{speed_upload}"},"sslVerifyResult":"%{ssl_verify_result}","time":{"appconnect":"%{time_appconnect}","connect":"%{time_connect}","namelookup":"%{time_namelookup}","pretransfer":"%{time_pretransfer}","redirect":"%{time_redirect}","starttransfer":"%{time_starttransfer}","total":"%{time_total}"},"urlEffective":"%{url_effective}"}
    
    $ cat time-format.txt
    time_namelookup:%{time_namelookup} time_connect:%{time_connect} time_appconnect:%{time_appconnect} time_pretransfer:%{time_pretransfer} time_redirect:%{time_redirect} time_starttransfer:%{time_starttransfer} time_total:%{time_total}\n
    
    $ while [ 1 ];do echo -n "$(date) - " ; curl -w @time-format.txt -o /dev/null -s https://myapp.mydom.com/v1/endpt-http; sleep 1; done | grep -v time_total:0
    
    Mon Dec 16 17:51:47 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.172 time_pretransfer:0.172 time_redirect:0.000 time_starttransfer:1.666 time_total:1.666
    Mon Dec 16 17:51:50 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.175 time_pretransfer:0.175 time_redirect:0.000 time_starttransfer:3.794 time_total:3.795
    Mon Dec 16 17:51:55 UTC 2019 - time_namelookup:0.004 time_connect:0.017 time_appconnect:0.175 time_pretransfer:0.175 time_redirect:0.000 time_starttransfer:1.971 time_total:1.971
    Mon Dec 16 17:51:58 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.173 time_pretransfer:0.173 time_redirect:0.000 time_starttransfer:1.161 time_total:1.161
    Mon Dec 16 17:52:00 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.166 time_pretransfer:0.167 time_redirect:0.000 time_starttransfer:1.434 time_total:1.434
    Mon Dec 16 17:52:02 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.177 time_pretransfer:0.177 time_redirect:0.000 time_starttransfer:5.119 time_total:5.119
    Mon Dec 16 17:52:08 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.172 time_pretransfer:0.172 time_redirect:0.000 time_starttransfer:30.185 time_total:30.185
    Mon Dec 16 17:52:39 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.164 time_pretransfer:0.164 time_redirect:0.000 time_starttransfer:30.175 time_total:30.176
    Mon Dec 16 17:54:28 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:3.191 time_pretransfer:3.191 time_redirect:0.000 time_starttransfer:3.212 time_total:3.212
    Mon Dec 16 17:56:08 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:1.184 time_pretransfer:1.184 time_redirect:0.000 time_starttransfer:1.215 time_total:1.215
    Mon Dec 16 18:00:24 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.181 time_pretransfer:0.181 time_redirect:0.000 time_starttransfer:1.267 time_total:1.267