Question Comment mesurer les demandes et les temps de réponse à la fois en utilisant cURL?


J'ai un service Web qui reçoit des données au format JSON, traite les données, puis renvoie le résultat au demandeur.

Je veux mesurer la demande, la réponse et le temps total en utilisant cURL.

Ma demande d'exemple ressemble à:

curl -X POST -d @file server:port

et je mesure actuellement cela en utilisant le time commande sous Linux:

time curl -X POST -d @file server:port

La commande de temps ne mesure que total le temps, cependant - ce qui n'est pas tout à fait ce que je cherche.

Existe-t-il un moyen de mesurer les temps de requête et de réponse en utilisant cURL?


411
2017-08-13 17:21


origine


Réponses:


De ce blog brillant ... https://blog.josephscott.org/2011/10/14/timing-details-with-curl/

cURL prend en charge la sortie formatée pour les détails de la demande (voir la page de manuel cURL pour plus de détails, en dessous de -w, –write-out <format>). Pour nos besoins, nous nous concentrerons uniquement sur les détails de synchronisation fournis.

  1. Créez un nouveau fichier, curl-format.txt, et collez-le dans:

        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. Faire une demande:

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

    Ou sur Windows, c'est ...

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


Qu'est-ce que cela fait:

-w "@curl-format.txt" dit à cURL d'utiliser notre fichier de format
-o /dev/null redirige la sortie de la requête vers / dev / null
-s  indique à cURL de ne pas afficher de progression
"http://wordpress.com/" est  l'URL que nous demandons Utilisez des guillemets en particulier si votre URL a des paramètres de chaîne de requête "&"


Et voici ce que vous obtenez:

   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


Créer un raccourci Windows (fichier BAT)

Placez cette commande dans CURLTIME.BAT (dans le même dossier que curl.exe)

curl -w "@%~dp0curl-format.txt" -o NUL -s %*

Ensuite, vous pouvez simplement appeler ...

curltime wordpress.org

1068
2018-03-25 03:55



Voici la réponse:

curl -X POST -d @file server:port -w %{time_connect}:%{time_starttransfer}:%{time_total}

Toutes les variables utilisées avec -w peuvent être trouvés dans man curl.


98
2017-08-13 17:31



Option 1. Pour mesurer le temps de réponse avec curl, utilisez la commande suivante:

curl -o /dev/null -s -w 'Total: %{time_total}\n'  https://www.google.com

Sortie de l'échantillon:

enter image description here

Option 2. Pour obtenir plus de détails, utilisez la commande suivante:

curl -o /dev/null -s -w 'Connect: %{time_connect}\nStart Transfer: %{time_starttransfer}\nTotal: %{time_total}\n'  https://www.google.com

Sortie de l'échantillon:

enter image description here

Ref: Obtenez le temps de réponse avec curl


44
2018-02-24 10:06



Un raccourci que vous pouvez ajouter à votre fichier .bashrc, basé sur d’autres réponses ici:

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

Usage:

> perf stackoverflow.com
0.521 + 0.686 = 1.290

42
2018-04-15 15:58



Si vous souhaitez analyser ou résumer la latence, vous pouvez essayer apache bench:

ab -n [number of samples] [url]

Par exemple:

ab -n 100 http://www.google.com/

Il montrera:

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)

12
2018-06-30 16:46



Ce qui suit est inspiré par la réponse de Simon. Il est autonome (ne nécessite pas de fichier de format séparé), ce qui le rend idéal pour l'inclusion dans .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" "$@"
}

De plus, cela devrait fonctionner avec tous les arguments curl prend normalement, puisque le "$@" juste les passe à travers. Par exemple, vous pouvez faire:

curl_time -X POST -H "Content-Type: application/json" -d '{"key": "val"}' https://postman-echo.com/post

Sortie:

   namelookup:  0,125000s
      connect:  0,250000s
   appconnect:  0,609000s
  pretransfer:  0,609000s
     redirect:  0,000000s
starttransfer:  0,719000s
-------------------------
        total:  0,719000s

12
2017-12-22 16:21



J'ai fait un formateur amical pour renifler des demandes de boucle pour aider au débogage (voir des commentaires pour l'usage). Il contient tous les paramètres de sortie connus que vous pouvez écrire dans un format facile à lire.

https://gist.github.com/manifestinteractive/ce8dec10dcb4725b8513


4
2017-08-17 04:08



Hey est mieux que Apache Bench, a moins de problèmes avec 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

1
2017-09-08 14:22



Voici un Bash one-liner pour frapper le même serveur à plusieurs reprises:

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

1
2017-07-16 15:41