{"id":7016,"date":"2020-11-29T15:35:30","date_gmt":"2020-11-29T13:35:30","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7016"},"modified":"2020-11-29T15:35:57","modified_gmt":"2020-11-29T13:35:57","slug":"anfrage-und-antwortzeit-mit-curl-messen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/anfrage-und-antwortzeit-mit-curl-messen\/","title":{"rendered":"Performance-Messung: Anfrage- und Antwortzeit mit curl messen"},"content":{"rendered":"<p>Das beliebte Kommandozeilenwerkzeug <strong>curl<\/strong> wird im Alltag oft verwendet, um Anfragen (meist HTTP) auf der Konsole durchzuf\u00fchren. Standardm\u00e4\u00dfig zeigt das Program allerdings keine Informationen zur zeitlichen Abfolge an. Gerade bei Tests w\u00e4re es durchaus sinnvoll zu wissen, wie lange welcher Teil der Anfrage bzw. Antwort gedauert hat. Doch auch hier bietet <strong>curl<\/strong> einige Funktionen, um die Antwortzeiten verschiedener Abschnitte aufzuzeigen.<\/p>\n<h2 class=\"wp-block-heading\">Kompakter Einzeiler ohne Template-Datei<\/h2>\n<p>\u00dcber den -w Parameter lassen sich diverse Variablen als Template \u00fcbergeben. Curl gibt dies nach der Anfrage aus und ersetzt die Platzhalter. Abh\u00e4ngig von der installierten Version stehen hier einige Variablen zur Verf\u00fcgung. Neben den Antwortzeiten k\u00f6nnen auch andere Informationen ausgegeben werden. Beispielsweise zeigt <strong>remote_ip<\/strong> die aufgel\u00f6ste IP-Adresse des Zielservers. Wird curl f\u00fcr Uploads\/Downloads genutzt, k\u00f6nnen hierzu auch weitere Details angezeigt werden. Die Variablen <strong>size_download <\/strong>oder <strong>size_upload <\/strong>sind hier nur ein Auszug. Eine detaillierte Beschreibung aller Variablen kann man \u00fcber die manpage (<strong>man curl<\/strong>) abrufen (Nach <strong>&#8211;write-out<\/strong> suchen). Hier sieht man auch, welche in der jeweils installierten Version zur Verf\u00fcgung stehen<\/p>\n<p>Im Folgenden konzentrieren wir uns auf Metriken zur Performance-Messung. Grundlegend wichtig w\u00e4re die Verbindungszeit der zugrundeliegenden TCP-Verbindung. Oder die Zeit, bis wir das erste Byte an Daten vom Server erhalten. Und schlussendlich nat\u00fcrlich die insgesamt ben\u00f6tigte Zeitspanne &#8211; diese ist am Ende f\u00fcr den Nutzer relevant.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# curl -s -w &quot;%{time_connect} + %{time_starttransfer} = %{time_total}s\\n&quot; -o \/dev\/null &quot;https:\/\/u-labs.de\/portal&quot;\n0.020156 + 0.112156 = 0.112191s\n<\/pre>\n<\/div>\n<h2 class=\"wp-block-heading\">Komplexere Vorlagen mit Textdatei erstellen<\/h2>\n<p>F\u00fcr 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\u00f6chte man diese ebenfalls ausgeben, wird der Einzeiler schnell lang und un\u00fcbersichtlich. Auch f\u00fcr diesen Fall hat curl vorgesorgt: Man kann eine Textdatei angeben, die das gew\u00fcnschte Template enth\u00e4lt. Hierf\u00fcr erstellen wir beispielhaft eine Datei <strong>curl-format.txt<\/strong> mit folgendem Inhalt:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nnamelookup:     %{time_namelookup}s\\n\nconnect:        %{time_connect}s\\n\nappconnect:     %{time_appconnect}s\\n\npretransfer:    %{time_pretransfer}s\\n\nredirect:       %{time_redirect}s\\n\nstarttransfer:  %{time_starttransfer}s\\n\nTOTAL:          %{time_total}s\\n\n<\/pre>\n<\/div>\n<p>Nun kann die Datei mit dem -w Schalter und einem vorangestellten At-Zeichen (@) \u00fcbergeben werden:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# curl -s -w @curl-format.txt -o \/dev\/null &quot;https:\/\/u-labs.de\/portal&quot;\nredirect:       0.000000s\nnamelookup:     0.000952s\nconnect:        0.017513s\nappconnect:     0.085631s\npretransfer:    0.085700s\nstarttransfer:  0.101855s\nTOTAL:          0.101895s\n<\/pre>\n<\/div>\n<p>Zu den Weiterleitungen (Redirects) ist noch wichtig zu wissen, dass curl standardm\u00e4\u00dfig diesen nicht folgt. Getestet werden kann dies unter https:\/\/u-labs.de &#8211; hier erfolgt eine Weiterleitung auf \/portal. W\u00fcrden 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.<\/p>\n<p>Das macht zur Performance-Messung nat\u00fcrlich wenig Sinn. Schlie\u00dflich folgt ein echter Nutzer auch der Weiterleitung und l\u00e4dt die entsprechende Zielseite. Damit curl dies ebenfalls macht, m\u00fcssen wir den Schalter -L angeben:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# curl -s -L -w @curl-format.txt -o \/dev\/null &quot;https:\/\/u-labs.de&quot;\nnamelookup:     0.000867s\nconnect:        0.019916s\nappconnect:     0.090963s\npretransfer:    0.091047s\nredirect:       0.109705s\nstarttransfer:  0.127641s\nTOTAL:          0.179179s\n<\/pre>\n<\/div>\n<p>Wie man sieht, haben wir nun rund 0,11s f\u00fcr die Weiterleitung aufwenden m\u00fcssen. Bei der Gegenprobe ohne -L auf https:\/\/u-labs.de gibt curl hier 0 Sekunden zur\u00fcck. Denn in diesem Falle misst das Tool einfach die Dauer der ersten Anfrage,  die mit einer Weiterleitung (statt dem DOM der Seite) bearbeitet wird.<\/p>\n<p>F\u00fcr den Artikel wurde curl 7.64.0 unter Debian Buster (10) verwendet. Abh\u00e4ngig von der installierten Version sind manche Variablen m\u00f6glicherweise nicht verf\u00fcgbar. Beispielsweise wurde <strong>time_appconnect<\/strong> in Version 7.19.0 hinzugef\u00fcgt. Welche Version installiert ist, l\u00e4sst sich mit <strong>curl &#8211;version<\/strong> pr\u00fcfen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das beliebte Kommandozeilenwerkzeug curl wird im Alltag oft verwendet, um Anfragen (meist HTTP) auf der Konsole durchzuf\u00fchren. Standardm\u00e4\u00dfig zeigt das Program allerdings keine Informationen zur zeitlichen Abfolge an. Gerade bei Tests w\u00e4re es durchaus sinnvoll zu wissen, wie lange welcher Teil der Anfrage bzw. Antwort gedauert hat. Doch auch hier bietet curl einige Funktionen, um &#8230;<\/p>\n","protected":false},"author":5,"featured_media":7017,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74],"tags":[839,70],"class_list":["post-7016","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-curl","tag-performance"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7016","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7016"}],"version-history":[{"count":2,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7016\/revisions"}],"predecessor-version":[{"id":7019,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7016\/revisions\/7019"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/7017"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}