Categories
Linux redes

Cómo monitorear la velocidad de internet con speedtest-cli y iperf3 desde Python

En ocasiones nos gustaría poder saber cómo se ha estado comportando nuestra velocidad de internet o solo nos gustaría comprobar si estamos obteniendo la velocidad que tenemos contratada con nuestro proveedor de internet. Como averiguaremos esto es muy sencillo y solo necesitamos una computadora con acceso a internet y un poco de paciencia.

Requisitos

Obtener código fuente

Para poder monitorear el desempeño de nuestra red es necesario obtener el código fuente que se encargará de obtener las mediaciones programaticamente. El código se puede obtener desde la siguiente dirección

https://github.com/nestortechtips/monitor-velocidad/archive/refs/heads/main.zip

Dentro del archivo zip nos encontraremos con la siguiente estructura de archivos

.
|____requirements.txt
|____README.md
|____main.py

Instalar dependencias

Para que se pueda ejecutar la biblioteca iperf3 sin incovenientes se require instalar la biblioteca homónima en el sistema operativo. A continuación mostraremos cómo hacerlo en Ubuntu 20.04

apt-get update && apt-get install iperf3 -y

Ahora instalaremos las bibliotecas requeridas por nuestro programa de Python, el cuál utiliza Python 3+ (en caso de no tener Python instalado en nuestro sistema podemos instalarlo siguiendo la documentación oficial)

pip install -r requirements.txt

Comprendiendo el código

Ya que contamos con las dependencias del programa, tomemos un momento para analizar el código.

El programa consiste de un par de métodos que se encargan de obtener las mediciones de iperf3 y speedtest-cli además de un método principal que se encarga de orquestrar la ejecución del programa

obtener_velocidad_internet_speedtest_cli

Este método se encarga de obtener la medición de velocidad de speedtest. La línea test_velocidad_subida = speedtest.Speedtest() se encarga de crear el objeto por el que obtendremos el servidor con el que se realizará prueba (el servidor se obtiene de forma aleatoria pero es posible especificar uno en particular) y las velocidades de bajada y subida con los métodos test_velocidad_bajada.download() y test_velocidad_subida.upload() respectivamente. Los resultados de ambos métodos son en bits/segundo, para facilitar su interpretación se calculan en Mbits/segundo con las siguientes líneas velocidad_bajada /= (1 * 10 **6) y velocidad_subida /= (1 * 10 **6)

obtener_velocidad_internet_iperf3

Este método se encarga de obtener el ancho de banda disponible entre nuestra red y un servidor corriendo iperf3 públicamente (la lista de servidores disponibles se puede encontrar aquí). El método se encarga de crear un obtjeto iperf3 con los datos necesarios para realizar la prueba al servidor, los cuales son su hosts/dominio y puerto, adicionalmente configuramos la duración de la prueba en segundos (no se recomienda un duración mayor a 20 segundos para no interferir con la comunicación de los dispositivos en nuestra red). En código esto se ve de la siguiente manera

client = iperf3.Client()
client.duration = 7
client.server_hostname = 'iperf.scottlinux.com'
client.port = 5201

En el ejemplo anterior indicamos que el servidor se encuentra en el dominio iperf.scottlinux.com, que la prueba durará 7 segundos y que el servidor se encuentra escuchando en el puerto 5201

main

Por último el método main se encarga de configurar la ruta donde deseamos guardar el log de la ejecución filename=’/log/{HOST_NAME}.log, ejecutar los métodos obtener_velocidad_internet_speedtest_cli y obtener_velocidad_internet_iperf3 para obtener las medicione de velocidad.

Ejecucíon

El programa puede ejecutarse de la siguiente forma

python main.py

Después de unos momentos deberán aparecer en nuestra pantalla las mediciones de las pruebas realizadas

speedtest-cli descarga - 193.43 Mbits/s. Subida - 191.15 Mbits/s. Servidor - Axtel

iperf3 descarga - 28.833 Mbits/s. Subida - 30.929 Mbits/s