test - ¿Cómo mido la solicitud y los tiempos de respuesta a la vez utilizando cURL?
curl time_namelookup (10)
Aquí está la respuesta:
curl -X POST -d @file server:port -w %{time_connect}:%{time_starttransfer}:%{time_total}
Todas las variables utilizadas con -w
se pueden encontrar en man curl
.
Tengo un servicio web que recibe datos en formato JSON, procesa los datos y luego devuelve el resultado al solicitante.
Quiero medir la solicitud, la respuesta y el tiempo total usando cURL
.
Mi solicitud de ejemplo se ve así:
curl -X POST -d @file server:port
y actualmente mido esto usando el comando de time
en Linux:
time curl -X POST -d @file server:port
Sin embargo, el comando de tiempo solo mide el tiempo total , que no es exactamente lo que estoy buscando.
¿Hay alguna manera de medir los tiempos de solicitud y respuesta usando cURL
?
Aquí hay un Bash de una sola línea para golpear el mismo servidor repetidamente:
for i in {1..1000}; do curl -s -o /dev/null -w "%{time_total}/n" http://server/get_things; done
Hey es mejor que Apache Bench, tiene menos problemas con 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
Hice un formateo amigable para detectar solicitudes de curl para ayudar con la depuración (ver comentarios para el uso). Contiene todos los parámetros de salida conocidos que puede escribir en un formato fácil de leer.
https://gist.github.com/manifestinteractive/ce8dec10dcb4725b8513
Lo siguiente está inspirado en la respuesta de Simon. Es autónomo (no requiere un archivo de formato separado), lo que lo hace ideal para incluirlo en .bashrc
.
curl_time() {
curl -so /dev/null -w "/
namelookup: %{time_namelookup}s/n/
connect: %{time_connect}s/n/
appconnect: %{time_appconnect}s/n/
pretransfer: %{time_pretransfer}s/n/
redirect: %{time_redirect}s/n/
starttransfer: %{time_starttransfer}s/n/
-------------------------/n/
total: %{time_total}s/n" "$@"
}
Además, debería funcionar con todos los argumentos que normalmente toma curl
, ya que el "$@"
simplemente los pasa. Por ejemplo, puedes hacer:
curl_time -X POST -H "Content-Type: application/json" -d ''{"key": "val"}'' https://postman-echo.com/post
Salida:
namelookup: 0,125000s
connect: 0,250000s
appconnect: 0,609000s
pretransfer: 0,609000s
redirect: 0,000000s
starttransfer: 0,719000s
-------------------------
total: 0,719000s
Otra opción que es quizás la más simple en términos de la línea de comandos es agregar la opción incorporada --trace-time
:
curl -X POST -d @file server:port --trace-time
A pesar de que técnicamente no genera los tiempos de los distintos pasos según lo solicitado por el OP, sí muestra las marcas de tiempo para todos los pasos de la solicitud, como se muestra a continuación. Usando esto, puedes (bastante fácilmente) calcular cuánto tiempo ha tomado cada paso.
$ 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
Si desea analizar o resumir la latencia, puede probar apache bench:
ab -n [number of samples] [url]
Por ejemplo:
ab -n 100 http://www.google.com/
Se mostrará:
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)
Un atajo que puede agregar a su .bashrc, etc., basado en otras respuestas aquí:
function perf {
curl -o /dev/null -s -w "%{time_connect} + %{time_starttransfer} = %{time_total}/n" "$1"
}
Uso:
> perf .com
0.521 + 0.686 = 1.290
De esta brillante publicación de blog ... https://blog.josephscott.org/2011/10/14/timing-details-with-curl/
cURL admite salida formateada para los detalles de la solicitud (consulte la página de manual de cURL para obtener más información , debajo de -w, –write-out <format>
). Para nuestros propósitos, nos centraremos solo en los detalles de tiempo que se proporcionan.
Crea un nuevo archivo, curl-format.txt, y pega en:
time_namelookup: %{time_namelookup}/n time_connect: %{time_connect}/n time_appconnect: %{time_appconnect}/n time_pretransfer: %{time_pretransfer}/n time_redirect: %{time_redirect}/n time_starttransfer: %{time_starttransfer}/n ----------/n time_total: %{time_total}/n
Hacer una solicitud:
curl -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"
O en Windows, es ...
curl -w "@curl-format.txt" -o NUL -s "http://wordpress.com/"
Lo que esto hace:
-w "@curl-format.txt"
le dice a cURL que use nuestro archivo de formato
-o /dev/null
redirige la salida de la solicitud a / dev / null
-s
le dice a cURL que no muestre un medidor de progreso
"http://wordpress.com/"
es la URL que solicitamos. Use comillas particularmente si su URL tiene "&" parámetros de cadena de consulta
Y aquí está lo que recibes:
time_namelookup: 0.001
time_connect: 0.037
time_appconnect: 0.000
time_pretransfer: 0.037
time_redirect: 0.000
time_starttransfer: 0.092
----------
time_total: 0.164
Hacer un acceso directo de Windows (también conocido como archivo BAT)
Ponga este comando en CURLTIME.BAT (en la misma carpeta que curl.exe)
curl -w "@%~dp0curl-format.txt" -o NUL -s %*
Entonces puedes simplemente llamar ...
curltime wordpress.org
Opción 1. Para medir el tiempo de respuesta con curl, use el siguiente comando:
curl -o /dev/null -s -w ''Total: %{time_total}/n'' https://www.google.com
Salida de muestra:
Opción 2. Para obtener más detalles, use el siguiente comando:
curl -o /dev/null -s -w ''Connect: %{time_connect}/nStart Transfer: %{time_starttransfer}/nTotal: %{time_total}/n'' https://www.google.com
Salida de muestra: