time_namelookup test example curl time upload download measure

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



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.

  1. 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

  2. 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:

Ref: obtener tiempo de respuesta con rizo