Publicado de https://cizixs.com/2017/04/11/use-curl-to-analyze-request/
Encontré un problema en mi trabajo recientemente, y la respuesta a una determinada solicitud fue particularmente lenta, por lo que espero que haya una manera de analizar qué paso de la solicitud lleva más tiempo, a fin de encontrar la causa del problema. Después de buscar en Internet, encontré un método muy útil: el comando curl puede ayudarlo a analizar las partes de la solicitud que requieren mucho tiempo.
El comando curl proporciona el parámetro -w, que se explica en la página de manual de la siguiente manera:
-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.
Puede imprimir cierta información de acuerdo con el formato especificado, que puede usar algunas variables específicas y admite caracteres de escape \ n, \ ty \ r. Se proporcionan muchas variables, como status_code, local_port, size_download, etc. En este artículo, solo nos enfocamos en las variables relacionadas con el tiempo de la solicitud (variables que comienzan con time_).
Primero escriba el siguiente contenido en el archivo de texto 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
Entonces, ¿qué significan estas variables? Dejame explicar:
time_namelookup: cuando se resuelve el nombre de dominio DNS, es el proceso de convertir https://zhihu.com en una dirección IP.
time_connect: la hora en la que se establece la conexión TCP, que es la hora del protocolo de enlace de tres vías
time_appconnect: la hora en la que se conecta el protocolo de capa superior, como SSL / SSH, por ejemplo connect / handshake time
time_redirect: el tiempo desde el inicio hasta la última transacción de solicitud
time_pretransfer: el tiempo desde el inicio de la solicitud hasta el inicio de la respuesta
time_starttransfer: el tiempo desde el inicio de la solicitud hasta el primer byte a ser transferido
time_total: todo el tiempo dedicado a esta solicitud Hora
Echemos un vistazo a una solicitud simple, sin redirección y sin tiempo de protocolo 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
Puede ver que se imprime el tiempo de cada paso de esta solicitud, y la unidad de cada número es segundos (segundos), de modo que puede analizar qué paso lleva más tiempo y facilitar la localización del problema. El significado de cada parámetro de este comando:
-w: lee el formato de la información a imprimir desde el archivo
-o / dev / null: descarta el contenido de la respuesta, porque aquí no nos importa, solo la situación de la solicitud que consume mucho tiempo
-s: no imprime la barra de progreso
de esta Salida, podemos calcular el tiempo de cada paso:
Consulta DNS: 12 ms
el tiempo de conexión TCP: pretransfter (227) - nameLookup ( 12) = 215ms
tiempo de procesamiento del servidor: starttransfter (443) - antes de la transferencia ( 227) = 216ms
contenido del tiempo de transmisión: total (867) - starttransfer ( 443) = 424ms
a Uno más complicado, visitar una determinada página de inicio, con redireccionamiento y protocolo SSL en el medio:
➜ ~ 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
Puede ver que time_appconnect y time_redirect ya no son 0, y el tiempo de procesamiento del protocolo SSL es 328-18 = 310ms. Y el tiempo de pretransfer y starttransfer se acorta, este es el tiempo de la solicitud después de la redirección.