我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者。
我想使用cURL测量请求、响应和总时间。
我的请求示例如下:
curl -X POST -d @file server:port
我现在用Linux中的time命令来测量:
time curl -X POST -d @file server:port
然而,time命令只测量总时间——这并不是我想要的。
有什么方法可以使用cURL来测量请求和响应时间吗?
我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者。
我想使用cURL测量请求、响应和总时间。
我的请求示例如下:
curl -X POST -d @file server:port
我现在用Linux中的time命令来测量:
time curl -X POST -d @file server:port
然而,time命令只测量总时间——这并不是我想要的。
有什么方法可以使用cURL来测量请求和响应时间吗?
当前回答
测量命令执行时间的通用解决方案
Linux / Mac OS / Unix
在Linux上,您可以使用time命令来测量执行一个命令所花费的时间
time curl https://en.wikipedia.org/wiki/Cat
输出:
ect...
</body>
</html>
real 0m0.565s
user 0m0.011s
sys 0m0.024s
这里的总时间/响应时间是真实时间。
这个解决方案是通用的,应该适用于任何Unix命令
time sleep 5
输出:
real 0m5.001s
user 0m0.001s
sys 0m0.000s
视窗电源外壳
您可以使用测量命令
其他回答
我做了一个友好的格式化器来嗅探curl请求,以帮助调试(参见注释了解用法)。它包含了您可以以易于阅读的格式写出的所有已知输出参数。
https://gist.github.com/manifestinteractive/ce8dec10dcb4725b8513
这是Simons答案的修改版本,使多行输出为单行。它还引入了当前时间戳,以便更容易地跟踪每一行输出。
样本格式
$ 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
cmd例子
$ 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
我使用上述方法来捕获上述端点上的慢响应。
一个你可以添加到你的.bashrc etc的快捷方式,基于这里的其他答案:
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
下面是一个Bash单行程序,可以重复访问同一个服务器:
for i in {1..1000}; do curl -s -o /dev/null -w "%{time_total}\n" http://server/get_things; done
如果你想分析或总结延迟,你可以尝试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)