Republié à partir de https://cizixs.com/2017/04/11/use-curl-to-analyze-request/
J'ai récemment rencontré un problème dans mon travail et la réponse à une certaine demande a été très lente, j'espère donc qu'il existe un moyen d'analyser quelle étape de la demande prend le plus de temps, afin de trouver davantage la cause du problème. Après une recherche sur Internet, j'ai trouvé une méthode très utile. La commande curl peut vous aider à analyser les parties chronophages de la requête.
La commande curl fournit le paramètre -w, qui est expliqué dans la page de manuel comme suit:
-w, --write-out <format>
Make curl display information on stdout after a completed transfer. The format is a string that may contain plain text mixed with any number of variables. The format
can be specified as a literal "string", or you can have curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write
"@-".
The variables present in the output format will be substituted by the value or text that curl thinks fit, as described below. All variables are specified as %{vari‐
able_name} and to output a normal % you just write them as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t.
Il peut imprimer certaines informations selon le format spécifié, qui peut utiliser certaines variables spécifiques, et prend en charge les caractères d'échappement \ n, \ t et \ r. De nombreuses variables sont fournies, telles que status_code, local_port, size_download, etc. Dans cet article, nous nous concentrons uniquement sur les variables liées à l'heure de la requête (variables commençant par time_).
Écrivez d'abord le contenu suivant dans le fichier texte curl-format.txt:
➜ ~ cat curl-format.txt
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_redirect: %{time_redirect}\n
time_pretransfer: %{time_pretransfer}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
Alors, que signifient ces variables? Laisse-moi expliquer:
time_namelookup: Lorsque le nom de domaine DNS est résolu, c'est le processus de conversion de https://zhihu.com en une adresse IP.
time_connect: l'heure à laquelle la connexion TCP est établie, qui est l'heure de la prise de
contact à trois voies time_appconnect: l'heure à laquelle le protocole de couche supérieure tel que SSL / SSH est connecté, par exemple Temps de connexion / prise de contact
time_redirect: le temps du début à la dernière demande de transaction
time_pretransfer: le temps du début de la demande au début de la réponse
time_starttransfer: le temps entre le début de la demande et le premier octet à transférer
time_total: tout le temps passé sur cette demande Time
Jetons un œil à une simple requête, pas de redirection et pas d'heure de protocole SSL:
➜ ~ curl -w "@curl-format.txt" -o /dev/null -s -L "http://cizixs.com"
time_namelookup: 0.012
time_connect: 0.227
time_appconnect: 0.000
time_redirect: 0.000
time_pretransfer: 0.227
time_starttransfer: 0.443
----------
time_total: 0.867
Vous pouvez voir que l'heure de chaque étape de cette demande est imprimée et que l'unité de chaque nombre est en secondes (secondes), afin que vous puissiez analyser quelle étape prend le plus de temps et faciliter la localisation du problème. La signification de chaque paramètre de cette commande:
-w: lire à partir du format de fichier des informations à imprimer
-o / dev / null: le contenu de la réponse est ignoré, car ici on s'en fiche, on se soucie uniquement de la situation chronophage demandée
-s: ne pas imprimer la barre
de progression à partir de ce Sortie, nous pouvons calculer le temps de chaque étape:
Requête DNS: 12ms
le temps de connexion TCP: pretransfter (227) - NAMELookup ( 12) = 215ms
temps de traitement du serveur: starttransfter (443) - pré - transfert ( 227) = 216ms
temps de transmission de contenu: total (867) - starttransfer ( 443) = 424ms
à Un plus compliqué, en visitant une certaine page d'accueil, avec la redirection et le protocole SSL au milieu:
➜ ~ curl -w "@curl-format.txt" -o /dev/null -s -L "https://baidu.com"
time_namelookup: 0.012
time_connect: 0.018
time_appconnect: 0.328
time_redirect: 0.356
time_pretransfer: 0.018
time_starttransfer: 0.027
----------
time_total: 0.384
Vous pouvez voir que time_appconnect et time_redirect ne valent pas 0 et que le temps de traitement du protocole SSL est de 328-18 = 310 ms. Et le temps de prétransfert et de démarrage de transfert est raccourci, c'est le temps de la demande après redirection.