Vous connaissez sans doute les multiples sites permettant de mesurer la vitesse de votre connexion Internet (Speedtest par exemple), et de frimer devant les copains si vous avez la fibre 🙂
Dernièrement j’ai eu besoin de monitorer la vitesse de ma connexion, c’est à dire prendre une mesure à intervalles régulier, et récupérer les données
Je m’attendais au pire et m’imaginais déjà parser les pages web pour y récupérer les résultats, mais pas du tout, il y a beaucoup plus simple
Comment mesurer la bande passante en ligne de commande?
Le site bien connu Speedtest.net propose un outil bien pratique pour lancer vos tests en ligne de commande
Cet outil dispose de nombreuses options vous permettant de choisir le test qui vous intéresse, et le format de sortie le plus facile à utiliser pour vous
Je vais donc vous expliquer comment installer cet outil, les options disponibles, et quelques exemples d’utilisation et d’analyse
Table des matières
Installation de speedtest-cli
L’outil dont je vais vous parler est donc speedtest-cli
Vous trouverez plus d’informations sur la page du projet si besoin
Installation via les dépôts
Sur une Debian ou Ubuntu, je vous conseille d’installer cela directement avec les commandes suivantes:
sudo apt-get update sudo apt-get install python-pip sudo pip install speedtest-cli
Installation manuelle
Si vous préférez, vous pouvez aussi télécharger le script python directement:
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod +x speedtest-cli
Quelque soit la méthode choisie, l’installation est désormais terminée, passons à l’utilisation
Mesure de la vitesse de votre connexion
Pour mesurer la bande passante, la commande basique est celle ci:
speedtest-cli
Cela vous affichera les 3 informations suivantes :
- Le ping
- La vitesse de téléchargement (download)
- La vitesse d’envoi (upload)
Voici un exemple de l’affichage:
# speedtest-cli Retrieving speedtest.net configuration... Retrieving speedtest.net server list... Testing from OVH SAS (92.222.88.59)... Selecting best server based on latency... Hosted by Naitways (Paris) [1.82 km]: 13.248 ms Testing download speed........................................ Download: 97.70 Mbits/s Testing upload speed.................................................. Upload: 95.50 Mbits/s
Cela est très rapide, et déjà c’est intéressant
Si vous êtes sous Linux, ou avez un Linux sous la main à votre domicile/travail, je trouve déjà que c’est plus rapide de lancer ça que d’aller sur le site 🙂
Les options disponibles
Mais ce n’est pas tout, de nombreuses options sont disponibles
Usage
Voici le détail de la commande aide:
# speedtest-cli -h usage: speedtest-cli [-h] [--no-download] [--no-upload] [--bytes] [--share] [--simple] [--csv] [--csv-delimiter CSV_DELIMITER] [--csv-header] [--json] [--list] [--server SERVER] [--exclude EXCLUDE] [--mini MINI] [--source SOURCE] [--timeout TIMEOUT] [--secure] [--no-pre-allocate] [--version] Command line interface for testing internet bandwidth using speedtest.net. -------------------------------------------------------------------------- https://github.com/sivel/speedtest-cli optional arguments: -h, --help show this help message and exit --no-download Do not perform download test --no-upload Do not perform upload test --bytes Display values in bytes instead of bits. Does not affect the image generated by --share, nor output from --json or --csv --share Generate and provide a URL to the speedtest.net share results image, not displayed with --csv --simple Suppress verbose output, only show basic information --csv Suppress verbose output, only show basic information in CSV format. Speeds listed in bit/s and not affected by --bytes --csv-delimiter CSV_DELIMITER Single character delimiter to use in CSV output. Default "," --csv-header Print CSV headers --json Suppress verbose output, only show basic information in JSON format. Speeds listed in bit/s and not affected by --bytes --list Display a list of speedtest.net servers sorted by distance --server SERVER Specify a server ID to test against. Can be supplied multiple times --exclude EXCLUDE Exclude a server from selection. Can be supplied multiple times --mini MINI URL of the Speedtest Mini server --source SOURCE Source IP address to bind to --timeout TIMEOUT HTTP timeout in seconds. Default 10 --secure Use HTTPS instead of HTTP when communicating with speedtest.net operated servers --no-pre-allocate Do not pre allocate upload data. Pre allocation is enabled by default to improve upload performance. To support systems with insufficient memory, use this option to avoid a MemoryError --version Show the version number and exit
On peut donc :
- Afficher le résultat en « bytes » plutôt qu’en « bits »
- Choisir les tests à faire (juste le Download par exemple)
- Choisir le format de l’affichage (Json et CSV seront très intéressants pour la suite notamment)
- Générer une image à partager directement en ligne de commande, par exemple:
- Afficher uniquement les chiffres importants sans le debug (vous aurez donc Ping, Download et Upload uniquement)
- Afficher la liste des serveurs disponible, et choisir celui qu’on veut utiliser pour le test
- etc …
Petite précision si vous êtes dans le même cas: je n’avais pas accès à toutes ces options avec une installation depuis les dépôts sur Debian 8.
J’imagine qu’il faut être sur la dernière version pour avoir tout ça, ou alors utilisez l’installation manuelle pour avoir la version complète avec toutes les options
Exemples
Option simple:
# speedtest-cli --simple Ping: 11.691 ms Download: 97.12 Mbit/s Upload: 99.31 Mbit/s
Option JSON sans upload:
# speedtest-cli --json --no-upload {"client": {"rating": "0", "loggedin": "0", "isprating": "3.7", "ispdlavg": "0", "ip": "92.222.88.59", "isp": "OVH SAS", "lon": "2.3292", "ispulavg": "0", "country": "FR", "lat": "48.8628"}, "bytes_sent": 0, "download": 97391791.12253797, "timestamp": "2018-12-14T05:53:18.558544Z", "share": null, "bytes_received": 122260468, "ping": 11.812, "upload": 0, "server": {"latency": 11.812, "name": "Paris", "url": "http://speedtest.naitways.net/upload.php", "country": "France", "lon": "2.3470", "cc": "FR", "host": "speedtest.naitways.net:8080", "sponsor": "Naitways", "lat": "48.8742", "id": "16476", "d": 1.8171187953225858}}
Vous avez compris le principe, je vous laisse jouer avec les autres options 🙂
Lire les résultats en PHP
Les différents format disponibles permettent un import facile dans votre logiciel préféré, par exemple on peut utiliser du PHP pour récupérer les valeurs
Dans mon cas j’ai aussi utiliser Cacti pour avoir le graph de l’historique, et Nagios pour avoir une alerte quand ça passe sous un certain seuil
Cela dépendra vraiment de vos besoins
Format JSON
Commençons par la commande précédente avec l’affichage au format JSON
JSON est vraiment un format facile à lire en PHP
En version rapide, voici un code fonctionnel:
<?php exec("/root/speedtest-cli --json --no-upload",$output); $tab = json_decode($output[0],TRUE); echo "Vitesse de téléchargement: " . round($tab["download"]/1024). " ko/s"; ?>
Pensez à adapter le chemin du script dans le exec (suivant le type d’installation que vous avez suivi)
Ensuite à vous d’adapter le reste du code pour gérer l’affichage comme bon vous semble
Vous pouvez ensuite lancer le script, cela produira l’affichage suivant:
# php test-json.php Vitesse de téléchargement: 95142 ko/s
Dans le cas du JSON, le nom du champ dans le tableau est le même que celui affiché en lançant la commande à la main, donc c’est très simple
Format CSV
Lorsque le format JSON est disponible, le CSV à moins d’intérêt je trouve
Car il est moins pratique à exploiter
Par contre cela me semble intéressant si l’on souhaite logguer l’historique dans un fichier, pour l’analyser par la suite
Vous pouvez par exemple l’ouvrir dans Excel et l’analyser comme bon vous semble
Et pour l’exemple je vais vous montrer comment créer une tâche planifiée de relevé de la bande passante, puis de le lire en PHP
Création de la tache planifiée
Sur Linux, on va programmer notre tâche planifiée dans crontab en suivant la procédure suivante:
- Lancer crontab en mode édition
crontab -e
- Coller cette ligne par exemple
*/5 * * * * /root/speedtest-cli --csv >> /root/speedtest.csv
Cela va lancer le script speedtest toutes les 5 minutes (à vous d’adapter suivant vos besoins), et enregistrer les résultats dans le fichier /root/speedtest.csv
Pensez aussi à modifier les chemins du script et du fichier si besoin
Au bout de quelques minutes, nous aurons donc un fichier contenant plusieurs lignes, chaque ligne représentant un résultat de speedtest
Nous allons maintenant voir comme le lire en PHP
Lecture du fichier CSV
Encore une fois j’ai créé rapidement un petit script PHP pour lire le CSV:
<?php if (($handle = fopen("/root/speedtest.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { echo $data[3]." => ".$data[6]."\n"; } fclose($handle); } ?>
Pensez à adapter le chemin du fichier dans le fopen
Ensuite dans un CSV les champs n’ont pas de nom mais des numéros, la première colonne est le numéro 0, la suivante le 1, etc …
Il faut donc passer le numéro de votre choix au tableau $data pour afficher ce qui vous intéresse
Evidemment vous pouvez personnaliser l’affichage, ou insérer les valeurs en base de donnée pour un traitement ultérieur
Au lancement du script vous devriez avoir un résultat de ce genre:
# php test-csv.php 2018-12-15T06:15:02.275776Z => 97088005.20650594 2018-12-15T06:20:01.626602Z => 96987530.59635574
Conclusion
Et voila pour les bases de l’utilisation de ce script très intéressant pour Speedtest
Evidemment les possibilités sont infinies et je vous ai juste montré les bases de ce que l’on peut en faire
Je vous laisse jouer avec, et n’hésitez pas à laisser un commentaire si vous avez trouvé une utilisation intéressante de ce script, ou si vous bloquez quelque part 🙂