Tiempos de respuesta (SSL handshake, TCP, DNS, redirección, etc) en consultas con Curl (HTTP/S, SSH, FTP, etc.)
Con el comando Curl es muy fácil obtener los tiempos de respuesta de las diferentes partes que forman una conexión FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE, LDAP, etc. Algo muy útil cuando se necesita obtener métricas (Cacti, collectd, etc) o simplemente obtener datos del rendimiento de las conexiones.
La flexibilidad que nos ofrece todas las opciones de Curl nos permite, no solo poder analizar los tiempos de respuesta de un servidor, si no también las perdidas de rendimiento al utilizar diferentes tipos de proxys, métodos HTTP, user-agents, etc.
Para obtener dichos tiempos de respuesta se utilizará la opción “-w” de Curl como se muestra en el siguiente ejemplo de una petición HTTPS.
curl -o /dev/null -L -qs -w "Tiempo en completar el handshake HTTPS: %{time_appconnect}\\nTiempo en conectar (TCP): %{time_connect}\\nTiempo en resolver DNS: %{time_namelookup}\\nTiempo pre-transferencia: %{time_pretransfer}\\nTiempo en completar la redirección: %{time_redirect}\\nTiempo hasta que el primer byte fue transferido: %{time_starttransfer}\\nTiempo total:%{time_total}\\n\\nURL final: %{url_effective}\\n" https://dominio.net Tiempo en completar el handshake HTTPS: 0,882 Tiempo en conectar (TCP): 0,459 Tiempo en resolver DNS: 0,253 Tiempo pre-transferencia: 0,882 Tiempo en completar la redirección: 0,935 Tiempo hasta que el primer byte fue transferido: 1,114 Tiempo total: 3,042 URL final: https://www.dominio.net/
Tiempos de respuesta disponibles en Curl.
- time_appconnect: Tiempo en segundos en completar el handshake (HTTPS / SSH / etc).
- time_connect: Tiempo en segundos en completar la conexión TCP con el destino.
- time_namelookup: Tiempo en segundos en completar la resolución del dominio (DNS).
- time_pretransfer: Tiempo en segundos hasta que la transferencia de ficheros comenzó. Esto incluye todos los comandos pre-transferencia y negociaciones requeridas por el protocolo.
- time_redirect: Tiempo en segundos en realizar los todos los redireccionamientos (incluyen búsqueda de nombre, conexión y la transferencia antes de iniciar la transacción final.
- time_starttransfer: Tiempo en segundos antes de enviar el primer byte (incluye “time_pretransfer” y también el tiempo que el servidor utilizó para calcular el resultado).
- time_total: Tiempo total en segundos en terminar toda la operación.
- url_effective: De haber múltiples redirecciones, mostraría la URL final.
Otro ejemplo incluyendo otros campos como velocidad media, tamaño de descarga, consulta, etc.
curl -o /dev/null -L -qs -w "\\nTiempo en completar el handshake HTTPS: %{time_appconnect}\\nTiempo en conectar (TCP): %{time_connect}\\nTiempo en resolver DNS: %{time_namelookup}\\nTiempo pre-transferencia: %{time_pretransfer}\\nTiempo en completar la redirección: %{time_redirect}\\nTiempo hasta que el primer byte fue transferido: %{time_starttransfer}\\nTiempo total:%{time_total}\\n\\nVelocidad media de bajada: %{speed_download} B/s\\nTotal Datos descargados: %{size_download} bytes / Cabeceras: %{size_header} bytes\\n\\nTamaño de la consulta HTTP/S: %{size_request} bytes\\n\\nURL final: %{url_effective} (%{num_redirects} redirecciones)\\n" https://dominio.com/fichero.txt Tiempo en completar el handshake HTTPS: 0,817 Tiempo en conectar (TCP): 0,329 Tiempo en resolver DNS: 0,125 Tiempo pre-transferencia: 0,817 Tiempo en completar la redirección: 0,000 Tiempo hasta que el primer byte fue transferido: 1,269 Tiempo total:81,862 Velocidad media de bajada: 209233,000 B/s Total Datos descargados: 17128295 bytes / Cabeceras: 762 bytes Tamaño de la consulta HTTP/S: 83 bytes URL final: https://dominio.com/fichero.txt (0 redirecciones)
También es posible configurar todos los parámetros en un archivo y usarlo en la linea de comandos de curl.
- curl_opciones.txt
Tiempo en completar el handshake HTTPS: %{time_appconnect}\n Tiempo en conectar (TCP): %{time_connect}\n Tiempo en resolver DNS: %{time_namelookup}\n Tiempo pre-transferencia: %{time_pretransfer}\n Tiempo en completar la redirección: %{time_redirect}\n Tiempo hasta que el primer byte fue transferido: %{time_starttransfer}\n =====\n Tiempo total:%{time_total}\n URL final: %{url_effective}\n
curl -w "@curl_opciones.txt" https://busindre.com
Frontend de métricas para Curl: https://github.com/reorx/httpstat
Pruebas de rendimiento HTTP/SSH con Curl (obtener valores medios)
Basando en lo anteriormente visto, se pueden obtener las medias de los valores que queramos tras un número determinado de pruebas.
Por ejemplo vamos a ver qué media de tiempo de respuesta tiene “time_appconnect” (Tiempo en completar el handshake HTTPS/SSH) con el dominio “www.XXX.com” al hacer 10 peticiones seguidas.
LC_NUMERIC="C" && for i in {1..10}; do curl -o /dev/null -L -qs -w %{time_appconnect}\\n https://www.XXX.com; done 2>&1 | awk '{sum += $1} END {print sum / NR}' 0.082159 # Borrar la parte awk de la tubería si se quiere obtener los valores de todas las peticiones.
Para usar Curl con el protocolo SSH es necesario que venga compilado explícitamente para soportarlo. La opción para compilar Curl con soporte ssh es “–with-libssh2”.
Para comprobar si la versión de Curl soporta libssh2 se puede ejecutar el comando curl con la opción -V.
curl -V curl 7.59.0 (x86_64-pc-linux-gnu) libcurl/7.59.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.20.1 (+libidn2/2.0.4) nghttp2/1.30.0 # No tiene soporte ya que no se en la salida algo como libssh2/1.8.0-3