Graficando la velocidad de internet.

De acuerdo a un sample de 30h mi velocidad promedio el fin de semana es de 44Mbps de 100Mbps que tengo contratados.

Quizá sea solo yo, pero el Internet ha estado desesperantemente lento estos últimos días… Decidí darme a la tarea de validar si es solo mi percepción o es la realidad. Digo, todos queremos siempre un internet más rápido.

La metodología

Utilicé SpeedTest.net para realizar las pruebas. Es la misma herramienta que utiliza TotalPlay (mi proveedor) para hacer las pruebas de velocidad cuando llamas a soporte.

Solo con una pequeña limitante: Del listado de servidores que tienen publicado solo tomé Nodos en Texas, California y Querétaro por dos razones:

  1. TotalPlay tiene peering en Texas. Su peering provider es Tier1. Tráfico directo a las dos costas de USA.
  2. Tengo servidores en Texas, California y Querétaro (con SoftLayer). Por lo que es más o menos representativo de mi “uso normal”.

Normalmente el proveedor te hace elegir uno de sus servidores en Guadalajara o CDMX. Pero como usuario de Internet raramente uso tráfico Local. Imagino que es caso similar para la mayoría. Normalmente todos navegamos páginas con CDNs en USA. No tiene caso probar localmente.

Global Network (Cogent)
Route to US — West Coast (Cogent to SoftLayer)
Route to US — East Coast (Cogent to Azure)

La implementación

NodeJS hace un SpeedTest cada minuto, almacena resultados en DocumentDB. El Cliente los consulta y los grafica.

Para este “pet project” utilicé un Cubieboard que tengo en casa como DHCP/DNS cache corriendo 24/7. Es un “System on a Chip”, como un Raspberry Pi pero con más galleta. En procesamiento es similar al de un iPad (A7) con 1GB en RAM y con 4GB de almacenamiento. Corre una versión de Ubuntu 14.04.

La App está dividia en dos módulos muy simples hechos en NodeJS:

Sampling

Se elige un servidor randomly entre los 15 servidores que seleccioné (según los criterios de arriba). Hace un SpeedTest cada minuto. Almacena el resultado en DocumentDB para el siguiente módulo.

DocumentDB es una base de datos NoSQL en la nube de Azure. Almacena la información en JSON pero puede ser consultada con queries tipo SQL. Es binary compatible con MongoDB.

Para mantener corriendo el proceso de Node utilizo Forever en el Cubieboard. Para instalar NodeJS utilicé NVM. Para el Scheduling utilicé LaterJS, es muy práctico y natural.

Analyzing

Para ver la información utilicé una gráfica hecha con Highcharts. Se consultan todos los samples y se calcula la velocidad promedio absoluto (la línea roja en la gráfica).

Sólo estoy utilizando la velocidad de Descarga. Aunque el SpeedTest devuelve más información:

JSON de una prueba de SpeedTest.net

Para la conexión a DocumentDB estoy utilizando directamente el SDK de Microsoft, pero se podría utilizar Mongoose o un ORM que soporte Mongo. La aplicación “publica” los resultados con la ayuda de Express y la vista de la gráfica es simplemente una página estática también servida desde express. Para manejar las fechas estoy utilizando Moment-Timezone.

El proyecto está publicado en GitHub. Para ejecutarlo solo hay que crear una cuenta grátis de Azure y guardar los datos de conexión en un archivo .env (o variables de entorno).

Lo suficientemente sencillo, como para que cualquiera pueda monitorear su conexión.

El resultado

Basado en ~2800 samples, en promedio TotalPlay me entrega 40.08Mbps de los 100Mbps de mi plan. Triste, menos del 50%. La tendencia no parece cambiar dependiendo de la hora (madrugada vs hora trabajo) ni del día (fin vs entre semana).

Levanté un ticket de soporte, hicieron unas pruebas en mi modem y la velocidad mejoró momentáneamente, me imagino que el problema va más allá de mi modem.

Por lo pronto lo seguiré monitoreando. Aunque quizá baje el rate de sampling, a lo mejor cada 10min en lugar de cada minuto.

Siguientes iteraciones

Voy a hacer un poco de refactoring para implementar el código con RxJS. Y que la gráfica se actualice de forma automática en tiempo real quizá con FeathersJS.

También quiero sacar el promedio por cada n samples, por ejemplo por hora para ver si hay alguna tendencia.

Y por último quiero agregar que haga un twit cuando la velocidad esté debajo de N por ciento y de ser posible que haga el reporte a IFT automáticamente.