Performance-Messung: Anfrage- und Antwortzeit mit curl messen

Performance-Messung: Anfrage- und Antwortzeit mit curl messen

Das beliebte Kommandozeilenwerkzeug curl wird im Alltag oft verwendet, um Anfragen (meist HTTP) auf der Konsole durchzuführen. Standardmäßig zeigt das Program allerdings keine Informationen zur zeitlichen Abfolge an. Gerade bei Tests wäre es durchaus sinnvoll zu wissen, wie lange welcher Teil der Anfrage bzw. Antwort gedauert hat. Doch auch hier bietet curl einige Funktionen, um die Antwortzeiten verschiedener Abschnitte aufzuzeigen.

Kompakter Einzeiler ohne Template-Datei

Über den -w Parameter lassen sich diverse Variablen als Template übergeben. Curl gibt dies nach der Anfrage aus und ersetzt die Platzhalter. Abhängig von der installierten Version stehen hier einige Variablen zur Verfügung. Neben den Antwortzeiten können auch andere Informationen ausgegeben werden. Beispielsweise zeigt remote_ip die aufgelöste IP-Adresse des Zielservers. Wird curl für Uploads/Downloads genutzt, können hierzu auch weitere Details angezeigt werden. Die Variablen size_download oder size_upload sind hier nur ein Auszug. Eine detaillierte Beschreibung aller Variablen kann man über die manpage (man curl) abrufen (Nach –write-out suchen). Hier sieht man auch, welche in der jeweils installierten Version zur Verfügung stehen

Im Folgenden konzentrieren wir uns auf Metriken zur Performance-Messung. Grundlegend wichtig wäre die Verbindungszeit der zugrundeliegenden TCP-Verbindung. Oder die Zeit, bis wir das erste Byte an Daten vom Server erhalten. Und schlussendlich natürlich die insgesamt benötigte Zeitspanne – diese ist am Ende für den Nutzer relevant.

# curl -s -w "%{time_connect} + %{time_starttransfer} = %{time_total}s\n" -o /dev/null "https://u-labs.de/portal"
0.020156 + 0.112156 = 0.112191s

Komplexere Vorlagen mit Textdatei erstellen

Für das obige Beispiel mag dies ausreichend sein. Doch wer in die Manpage zu curl schaut wird feststellen, dass es wie oben kurz angesprochen etliche weitere Variablen gibt. Möchte man diese ebenfalls ausgeben, wird der Einzeiler schnell lang und unübersichtlich. Auch für diesen Fall hat curl vorgesorgt: Man kann eine Textdatei angeben, die das gewünschte Template enthält. Hierfür erstellen wir beispielhaft eine Datei curl-format.txt mit folgendem Inhalt:

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
TOTAL:          %{time_total}s\n

Nun kann die Datei mit dem -w Schalter und einem vorangestellten At-Zeichen (@) übergeben werden:

# curl -s -w @curl-format.txt -o /dev/null "https://u-labs.de/portal"
redirect:       0.000000s
namelookup:     0.000952s
connect:        0.017513s
appconnect:     0.085631s
pretransfer:    0.085700s
starttransfer:  0.101855s
TOTAL:          0.101895s

Zu den Weiterleitungen (Redirects) ist noch wichtig zu wissen, dass curl standardmäßig diesen nicht folgt. Getestet werden kann dies unter https://u-labs.de – hier erfolgt eine Weiterleitung auf /portal. Würden wir also die obige Anfrage an https://u-labs.de statt https://u-labs.de/portal stellen, misst curl nur die Zeit bis zur Weiterleitung.

Das macht zur Performance-Messung natürlich wenig Sinn. Schließlich folgt ein echter Nutzer auch der Weiterleitung und lädt die entsprechende Zielseite. Damit curl dies ebenfalls macht, müssen wir den Schalter -L angeben:

# curl -s -L -w @curl-format.txt -o /dev/null "https://u-labs.de"
namelookup:     0.000867s
connect:        0.019916s
appconnect:     0.090963s
pretransfer:    0.091047s
redirect:       0.109705s
starttransfer:  0.127641s
TOTAL:          0.179179s

Wie man sieht, haben wir nun rund 0,11s für die Weiterleitung aufwenden müssen. Bei der Gegenprobe ohne -L auf https://u-labs.de gibt curl hier 0 Sekunden zurück. Denn in diesem Falle misst das Tool einfach die Dauer der ersten Anfrage, die mit einer Weiterleitung (statt dem DOM der Seite) bearbeitet wird.

Für den Artikel wurde curl 7.64.0 unter Debian Buster (10) verwendet. Abhängig von der installierten Version sind manche Variablen möglicherweise nicht verfügbar. Beispielsweise wurde time_appconnect in Version 7.19.0 hinzugefügt. Welche Version installiert ist, lässt sich mit curl –version prüfen.

Leave a Reply