Latencias — más allá de Madrid — a la región de Google Cloud Platform en España

En este artículo de blog se compararán las latencias entre las regiones de Madrid y Bélgica desde toda la geografía nacional española usando RIPE Atlas

Latencias — más allá de Madrid — a la región de Google Cloud Platform en España

Como ya he comentado anteriormente en el siguiente artículo de blog, se ha lanzado la nueva región de Google Cloud Platform (GCP) en Madrid.

Nueva región de GCP en Madrid: latencias y traslado de Storage
Compararemos la diferencias de latencias entre diferentes regiones de GCP y veremos cómo he migrado una serie de buckets de Google Cloud Storage desde Bélgica a Madrid.

Objetivo y metodología

Las ventajas de esta nueva región son múltiples, empezando por el descenso de latencia a nivel general de unos 20ms para Madrid como se puede ver aquí. Pero, aunque haya quien piense de forma distinta, ¡hay más allá de Madrid! En este artículo de blog veremos las latencias reales desde 165 puntos de nuestra geografía.

Además de medir las latencias desde estos 165 puntos hasta la región de Madrid, se repetirán las mismas pruebas contra la región de Bélgica. De esta forma conseguiremos una comparativa real de las ganancias en latencia con la apertura de la nueva región.

Las mediciones se han realizado contra dos máquinas virtuales, una en cada región (Bélgica y Madrid):

Máquinas virtuales lanzadas en GCP

¿Estaba en lo cierto Javier Martínez cuando aseguraba latencias de 1ms para la Comunidad de Madrid en la sesión de presentación celebrada el pasado 25 de mayo? Adelanto: ¡Sí, estaba en lo cierto! 😊

Imagen extraída del vídeo de la presentación en la que se puede ver “1ms“ escrito en la camiseta de Javier Martínez, Head of Customer Engineering en Google Cloud Spain and Portugal
Imagen extraída del vídeo de la presentación en la que se puede ver “1ms“ escrito en la camiseta de Javier Martínez, Head of Customer Engineering en Google Cloud Spain and Portugal

Pero, ¿cómo se va a realizar las mediciones desde más de 150 puntos de la geografía nacional? ¡Eso son muchos sitios distintos! Con una herramienta fantástica: RIPE Atlas.

🔗
Si solo quieres ver el resultado final pulsa en este enlace.

¿Qué es RIPE Atlas?


RIPE Atlas es una de las plataformas de medición de parámetros de red en Internet de mayor despliegue a nivel mundial. Pone a disposición de sus miembros recursos que permiten realizar mediciones de redes. RIPE NCC es el organismo encargado de llevar adelante este proyecto.

La red global de sondas RIPE Atlas realiza mediciones activas acerca de la conectividad y capacidad de alcance de Internet. Esta red facilita una comprensión sin precedentes acerca del estado de Internet en tiempo real para toda la comunidad de Internet: cualquiera puede acceder a los mapas, estadísticas y resultados de las mediciones de RIPE Atlas.

RIPE Atlas es usada por miles de personas, investigadoras/es y administradores de red para, por ejemplo :

  • Monitorizar continuamente la capacidad de alcance de la red desde miles de puntos de observación alrededor del mundo.
  • Investigar y detectar problemas de red con controles de conectividad rápidos y flexibles.
  • Crear alarmas usando los comprobadores de estado de RIPE Atlas, que pueden integrarse con sus propias herramientas de monitorización.
  • Medir la capacidad de respuesta de su infraestructura DNS o la de los servidores raíz.
  • Probar la conectividad IPv6.

Como ejemplos, podemos destacar el estudio que hizo la fundación Wikimedia (que gestiona, entre otros proyectos, Wikipedia) para saber dónde posicionar puntos de presencia (PoPs) para su Red de Distribución de Contenido (CDN) internacional y desde cuál servir a los diferentes usuarios.

En la siguiente imagen podemos ver la cantidad de dispositivos en España conectados a la red de RIPE (en adelante, probes) desde los que podemos lanzar mediciones. También puedes consultar la información más actualizada en este enlace.

Imagen con la distribución de pruebas RIPE Atlas en territorio nacional. Fuente: RIPE Atlas/Elaboración propia

Resultados

En las siguientes imágenes veremos las latencias sobre un mapa de nuestra geografía. En las capturas se omiten los datos de las Islas Canarias, pero se pueden consultar en los enlaces correspondientes.

También se ha generado un Dashboard de Google Data Studio para facilitar la comparativa. (Lo puedes encontrar a continuación en este artículo).

💡
Por comentarlo brevemente, para la región de Madrid 138 probes tiene latencias menores de 20ms. Latencias inferiores a 20ms solo se producen en 2 probes para la región de Bélgica.

Latencias a la región de Madrid

Puedes acceder a los detalles desde este enlace.

Latencias a la región de Bélgica

Puedes acceder a los detalles desde este enlace.

Informe de resumen en Google Data Studio

Haciendo clic en la imagen a continuación podrás acceder a un informe en Google Data Studio en el que podrás acceder a todos los datos. Está dividido en dos secciones: un mapa interactivo en la parte superior y una tabla en la parte inferior.

Moviéndote por el mapa verás diversos puntos. El tamaño indica la latencia hasta Madrid; a menor tamaño, menor latencia. El color indica la latencia hasta la región de Bélgica; cuanto más claro es el color, menor latencia. Si haces clic sobre un punto verás el Identificador de la Probe sobre la que se ha lanzado la medición, así como las latencias a ambas regiones.

En la tabla inferior puedes ordenar los valores de las columnas. También existe una columna en la que se puede consultar la diferencia de latencias entre ambas zonas. En la parte inferior de la tabla se encuentra la media de todos los valores. Tal y como se puede ver, la diferencia media de latencia está en 19,54 ms.

🌐
También puedes abrirlo en pantalla completa utilizando este enlace.

Para “frikis”: cocinado de datos para el informe de GDS

En esta sección explicaré cómo he tratado los datos para prepararlos y subirlos a Google Big Query (también llamado, cocinarlos).

En ningún momento se han modificado los valores, eso vaya por delante. Pero, para general el mapa, por ejemplo, debemos facilitar la información de una forma definida. Además, desde los enlaces de descarga de los resultados no se proveen las coordenadas de las Probes. Por este motivo, hay que conseguirlo y luego unirlo todo.

Descarga de datos de las pruebas

Descargamos los datos (formato json-nd) desde los siguientes enlaces

El resultado serán dos archivos JSON con el siguiente formato:

{"fw":5020,"mver":"2.2.1","lts":54,"dst_name":"34.175.157.154","af":4,"dst_addr":"34.175.157.154","src_addr":"192.168.10.6","proto":"ICMP","ttl":57,"size":48,"result":[{"rtt":13.795059},{"rtt":103.823696},{"rtt":62.095018}],"dup":0,"rcvd":3,"sent":3,"min":13.795059,"max":103.823696,"avg":59.904591,"msm_id":41688525,"prb_id":1000650,"timestamp":1654958489,"msm_name":"Ping","from":"79.156.126.125","type":"ping","group_id":41688525,"step":null,"stored_timestamp":1654958500}

{"fw":5020,"mver":"2.2.1","lts":50,"dst_name":"34.175.157.154","af":4,"dst_addr":"34.175.157.154","src_addr":"172.18.1.17","proto":"ICMP","ttl":57,"size":48,"result":[{"rtt":5.551287},{"rtt":4.829184},{"rtt":4.798678}],"dup":0,"rcvd":3,"sent":3,"min":4.798678,"max":5.551287,"avg":5.0597163333,"msm_id":41688525,"prb_id":1000961,"timestamp":1654958489,"msm_name":"Ping","from":"83.38.84.45","type":"ping","group_id":41688525,"step":null,"stored_timestamp":1654958499}

Lo subiremos a GCS, bien mediante la interfaz web, usando gsutil o cualquier otra opción disponible.

Conjuntos de datos - measurements

Creamos el conjunto de datos altas-latency-mad-gcp-zone. En este momento crearemos dos tablas:

  • belgium
  • spain

Evidentemente, cada una tendrá los resultados de cada correspondiente measurement. En la imagen a continuación podemos ver el ejemplo de la tabla belgium.

Ejemplo de consulta SQL BigQuery

Para comprobar que la información es correcta podemos usar la siguiente consulta:

SELECT prb_id, avg, min max 
FROM `pablo-glez.altas_latency_mad_gcp_zone.belgium` 
WHERE avg != -1.0
ORDER BY avg asc
LIMIT 1000

Que dará como resultado:

Datos sobre coordenadas geográficas

Inicialmente debemos obtener, desde los datos obtenidos desde RIPE Atlas, cuáles son las probes que han intervenido en la measurement.

gsutil cp gs://pablo-glez/ES-RIPE-Atlas-measurement-41688525.json .
cat ES-RIPE-Atlas-measurement-41688525.json |  jq .prb_id

El comando de la línea 2 parseará el JSON para ofrecernos únicamente los IDs de las probes, una por línea.

Si únicamente queremos la los datos de una prueba podemos usar los siguientes comandos. El primero para obtener la longitud y el segundo para la latitud

curl -s https://atlas.ripe.net/api/v2/probes/715/ | jq .geometry.coordinates[0]

curl -s https://atlas.ripe.net/api/v2/probes/715/ | jq .geometry.coordinates[1]

Sin embargo, queremos los datos de más de 150 probes. Inviable hacerlo de forma manual. ¿Qué hacemos entonces? Efectivamente, ¡automatizar el proceso!

Con este sencillo script:

#!/bin/bash
probe_id=${1}
temp=`curl -s https://atlas.ripe.net/api/v2/probes/${probe_id}`
latitude=`echo ${temp} | jq .geometry.coordinates[1]`
longitude=`echo ${temp} | jq .geometry.coordinates[0]`
echo "\"${probe_id}\",\"${latitude}\",\"${longitude}\"" >> data.csv

A continuación, generamos el archivo `data.csv`, añadiendo también los nombres de las columnas:

echo "\"probe_id\",\"latitude\",\"longitude\"" >> data.csv

El script espera que pasemos mediante entrada estándar (STDIN) un ID de Probe cada vez. Por tanto, le  llamaremos de la siguiente forma:

jq .prb_id ES-RIPE-Atlas-measurement-41688525.json | xargs -I % ./get-geo.sh %

El resultado es sencillo, pero potente:

"probe_id","latitude","longitude"
"1000650","41.3775","2.0495"
"1000961","40.3775","-3.7695"
"1001462","43.3585","-2.8495"

Unión de datos en una vista de BigQuery

Después de unir las fuentes de datos en BigQuery me di cuenta de que no era la solución más óptima, y me limitaba bastante a la hora de “jugar” con los datos. Por tanto, opté por la opción de unificar los datos en BigQuery en lugar de hacerlo en Data Studio.

La vista es generada con la siguiente consulta SQL (sí, con JOIN estaría mejor… 🫣):

SELECT 
  be.prb_id as prb_id,
  es.avg as es_avg,
  be.avg as be_avg,
  (be.avg - es.avg) as diff,
  CONCAT(geo.latitude,", ",geo.longitude) as geo_coords,
FROM 
  `pablo-glez.altas_latency_mad_gcp_zone.belgium` as be,
  `pablo-glez.altas_latency_mad_gcp_zone.spain` as es,
  `pablo-glez.altas_latency_mad_gcp_zone.geo-data` as geo
WHERE 
  be.prb_id = es.prb_id AND
  be.prb_id = geo.probe_id AND
  ( be.avg != -1.0 OR es.avg != -1.0 )
ORDER BY es.avg asc