Auteur Sujet: Script pour automatiser des tests descendant / monant avec Curl  (Lu 3345 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Script pour automatiser des tests descendant / monant avec Curl en simulant différentes latences, protocole utilisés (http 1.1 / http/2 ; IPv4 / IPv6 / ...)

C'est codé avec les pieds et pas optimisé, toutefois cela pourait servir à certians, voici le script qui m'a permis d'avoir ce type de données :

Débit en fonction de la perte de paquets pour une latence aller-retour de 16 millisecondes

Cette latence se rencontre principalement sur les réseaux FttH, quand le client et le serveur traversent plusieurs régions. Par exemple, la latence peut être de 16 millisecondes pour un client situé en région Auvergne-Rhône-Alpes qui utilise un serveur situé à proximité de son domicile, si le réseau du serveur est interconnecté avec celui du client à Paris. Le trajet réalisé peut être « client » => « Lyon (réseau du client) » => « Paris (réseau du client) » => « point de peering » => « Paris (réseau du serveur) » => « Lyon (réseau du serveur) » => « Serveur ».

On note que le débit avec l’algorithme d’évitement de congestion Cubic baisse significativement par rapport à BBR à partir de 0,05 % de perte de paquets. Le débit avec 0,5 % de perte de paquets est limité à 55 Mbit/s avec Cubic, contre 840 Mbit/s avec BBR.



vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Script pour automatiser des tests descendant / monant avec Curl
« Réponse #1 le: 23 août 2022 à 16:02:40 »
Le script va générer un fichier testdebit_log.csv où il met les résultats avec de nombreuses collones pour ensiuite filtrer les données facilement.
Pour avoir pluisuers itération, ce script perl est lancé via un fichier batch.
Je fais ces tests en local, avec un serveur directement connecté au client, sans passer par internet, toutefois, j'ai repris le certificat TLS de paris.testdebit.info afin d'avoir un nom de domaine.


#!/usr/bin/perl -w
use strict;
use Switch;

###################### testdebit.pl ######################
# Script perl de test de débit descendant pour Linux version 1.1 du 23 août 2022
# Écrit par Vivien GUEANT sous Licence publique générale GNUv3
# Débit affichés en Mb/s (1 Mb/s = 1 000 000 bits)
# Taille affichée en Mo (1 Mo = 1 000 000 octets)

###################### Dépendances à installer sous Ubuntu :
# sudo apt install curl libswitch-perl

############# INITIALISATION DES CHEMINS #################
my $LOGFILE_NAME = "/home/vivien/testdebit_log.csv";  # Fichier de log
my $UP_FILE_NAME = "/home/vivien/testdebit_upload.iso";  # Fichier pour l'upload
my $interface = "eno2"; # Interface réseau pour NetEm 1 Gb/s
#my $interface = "enp1s0"; # Interface réseau pour NetEm 10 Gb/s

###################### FONCTION CURL ######################
sub curl
{
# VARIABLES PASSEES EN ARGUMENT
my ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom) = @_;
my @CurlResult = "";

###################### GENERATION DE LA DATE ######################
my $time = localtime(time);
my $Annee = substr($time,length($time)-4);
my $Jour = substr($time,8,2);
if ($Jour < 10){ $Jour = "0".substr($Jour,1); }
my $Mois = substr($time,4,3);
switch ("$Mois") {
case "Jan" { $Mois = "01"; }
case "Feb" { $Mois = "02"; }
case "Mar" { $Mois = "03"; }
case "Apr" { $Mois = "04"; }
case "May" { $Mois = "05"; }
case "Jun" { $Mois = "06"; }
case "Jul" { $Mois = "07"; }
case "Aug" { $Mois = "08"; }
case "Sep" { $Mois = "09"; }
case "Oct" { $Mois = "10"; }
case "Nov" { $Mois = "11"; }
case "Dec" { $Mois = "12"; }
}
my $Heure = substr($time,length($time)-13,8); # Calcul de l'heure avec les minutes et les secondes
my $DateHeure = $Annee."-".$Mois."-".$Jour." ".$Heure; # DateHeure pour MySQL
#my $Date = $Annee."-".$Mois."-".$Jour; # Date pour MySQL
my $Date = $Jour."/".$Mois."/".$Annee; # Date pour fichier CSV
$Heure = substr($time,length($time)-13,2); # Calcul de l'heure sans les minutes, ni les secondes
my $DateHeure0000 = $Annee."-".$Mois."-".$Jour." ".$Heure.":00:00"; # DateHeure sans les minutes, ni les secondes pour faciliter les grpahes

###################### GENERATION DE LA PERIODE DE TEST (0=err 1=HeureNuit, 2=HeureCreuse, 3=HeurePleine) ######################
my $BH = "0";
switch ("$Heure") {
case "00" { $BH = "1"; }
case "01" { $BH = "1"; }
case "02" { $BH = "1"; }
case "03" { $BH = "1"; }
case "04" { $BH = "1"; }
case "05" { $BH = "1"; }
case "06" { $BH = "1"; }
case "07" { $BH = "2"; }
case "08" { $BH = "2"; }
case "09" { $BH = "2"; }
case [10..17] { $BH = "2"; }
case [18..22] { $BH = "3"; }
case "23" { $BH = "2"; }
}

###################### GENERATION DE LA PERIODE DE TEST (0=err 1=Semaine, 2=WeekEnd) ######################
my $WeekEnd = substr($time,0,3);
switch ("$WeekEnd") {
case "Mon" { $WeekEnd = "1"; }
case "Tue" { $WeekEnd = "1"; }
case "Wed" { $WeekEnd = "1"; }
case "Thu" { $WeekEnd = "1"; }
case "Fri" { $WeekEnd = "1"; }
case "Sat" { $WeekEnd = "2"; }
case "Sun" { $WeekEnd = "2"; }
else { $WeekEnd = "0"; }
}

###################### Téléchargement CURL ######################
if("$type_test" eq "download") {
print ("Fichier en cours de téléchargement : $serveur_url\n");
@CurlResult = `curl -$serveur_proto $serveur_http -s -w %{speed_download}-%{time_namelookup}-%{time_connect}-%{time_starttransfer}-%{time_total}-%{size_download}-%{remote_ip} -o /dev/null "$serveur_url"`;
}

if("$type_test" eq "upload") {
print ("Fichier en cours d'upload : $UP_FILE_NAME vers $serveur_url\n");
@CurlResult = `curl -$serveur_proto $serveur_http -s -w %{speed_upload}-%{time_namelookup}-%{time_connect}-%{time_starttransfer}-%{time_total}-%{size_upload}-%{remote_ip} -F filecontent=@"$UP_FILE_NAME" -o /dev/null "$serveur_url"`;
}

###################### Post-traitelment données brut CURL ######################

my @CurlData = split(/-/, $CurlResult[0]);

##### speed_download / speed_upload
$CurlData[0] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $debit_tout_inclus = 8 * $CurlData[0] /1000000;

##### DNS time_namelookup
$CurlData[1] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns = 1000 * $CurlData[1];

##### time_connect (inclus : DNS)
$CurlData[2] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns_time_connect = 1000 * $CurlData[2];

##### time_starttransfer (inclus : DNS + time_connect)
$CurlData[3] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $dns_ping_start = 1000 * $CurlData[3];

##### time_total (inclus : DNS + time_connect + time_starttransfer)
$CurlData[4] =~ s/,/\./; # remplacer la 1ère virgule par un point
my $time_total = 1000 * $CurlData[4];

##### size_download / size_upload
my $taille = $CurlData[5] /1000000;

##### remote_ip
my $remote_ip = $CurlData[6];

##### calculs
my $ping_tcp = $dns_time_connect - $dns;
my $start_transfer = $dns_ping_start - $dns_time_connect;
my $temps_transfert = $time_total - $dns_ping_start;

###################### Si division par 0, on quitte proprement ######################
if ("$temps_transfert" eq "0") {
print "Erreur de division par 0: temps_transfert=0 obtenu par time_total=$time_total - dns_ping_start=$dns_ping_start\n";
print LOG ("$DateHeure;$Date;$Heure;$BH;$WeekEnd;$DateHeure0000;$serveur_nom;$type_test;$taille;IPv$serveur_proto;0;$debit_tout_inclus;$dns;$ping_tcp;$start_transfer;$dns_ping_start;$temps_transfert;$remote_ip\n");
}
else {
my $debit_utile = 8000 * $taille / $temps_transfert;

###################### Sortie vers le fichier CSV ######################
print LOG ("$DateHeure;$Date;$Heure;$BH;$WeekEnd;$DateHeure0000;$serveur_nom;$type_test;$taille;IPv$serveur_proto;$debit_utile;$debit_tout_inclus;$dns;$ping_tcp;$start_transfer;$dns_ping_start;$temps_transfert;$remote_ip\n");
###################### Sortie au format texte ######################
print ("#####################################################################################\n");
print ("###################### Résultats du test du $Date à $Heure heure\n");
print ("###################### Transfert $type_test d'un fichier de $taille Mo en IPv$serveur_proto\n");
print ("#####################################################################################\n");
print ("Nom                                : $serveur_nom\n");
print ("Débit moyen utile (DNS + SYN exclu): $debit_utile Mb/s\n");
print ("Débit moyen réel  (temps1+t2+t3+t4): $debit_tout_inclus Mb/s\n");
print ("Temps1: résolution DNS             : $dns ms\n");
print ("Temps2: connexion [SYN]+[SYN ACK]  : $ping_tcp ms\n");
print ("Temps3: entre [SYN ACK] et 1er paq : $start_transfer ms\n");
print ("Somme de Temps1 + Temps2 + Temps3  : $dns_ping_start ms\n");
print ("Temps4: temps de transfert utile   : $temps_transfert ms\n");
print ("Taille utile transférée            : $taille Mo\n");
print ("Remote IP                          : $remote_ip\n");
print ("Date et heure                      : $DateHeure\n");
print ("#####################################################################################\n\n");
}
}

########################################################################
########################## DEBUT DU PROGRAMME ##########################
########################################################################

############# INITIALISATION DES VARIABLES #################
my $type_test ="0";      # download ou upload
my $serveur_proto = "0"; ## 4 pour IPv4 ou 6 pour IPv6
my $serveur_http = "0";  ## options curl tel que --http1.1 , --http2 ou --max-time 10
my $serveur_url = "0";   ## Url du serveur avec http:// ou https://
my $serveur_nom = "0";   ## Nom du serveur

###################### Sleep aléatoire de 3 minutes (180 secondes) avant le lancement ######################
#my $random = int(rand(180)) + 1;
#print ("Pause de $random secondes\n");
#`/bin/sleep $random`;

# Initialisation NetEm
`sudo tc qdisc add dev $interface root netem delay 0ms`;

############# OUVERTURE DU FICHIER DE LOG CSV #################
open(LOG, ">>$LOGFILE_NAME") || die "===> Kill : Impossible d'ouvrir le fichier de log $LOGFILE_NAME";


###########################################################
########################## TESTS ##########################
###########################################################

############# Tests Download IPv4
$type_test = "download";
$serveur_proto = "4";


`sudo tc qdisc change dev $interface root netem delay 0ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-0ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-0ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 1ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 2ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-2ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-2ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);

`sudo tc qdisc change dev $interface root netem delay 4ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-4ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-4ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 8ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-8ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-8ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 16ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-16ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-16ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 32ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-32ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-32ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 64ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-64ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-64ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 128ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-128ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-128ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 256ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-256ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-256ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 512ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-512ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-512ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);


`sudo tc qdisc change dev $interface root netem delay 1024ms`;
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1024ms-http1";
$serveur_http = "--max-time 10 --http1.1";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#############
`/bin/sleep 1`;
$serveur_nom = "cubic-perte10-1024ms-http2";
$serveur_http = "--max-time 10 --http2";
$serveur_url = "https://paris.testdebit.info/250Mi.iso";
curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);




############# Initialisation des tests d'Upload #############
if (-e "$UP_FILE_NAME") {
# Le fichier à uploader existe
}
else {
print ("Fichier upload $UP_FILE_NAME absent => Téléchargement\n");
`curl -o "$UP_FILE_NAME" "https://paris.testdebit.info/250Mi.iso"`
}

############# Tests Upload IPv4
$type_test = "upload";
$serveur_proto = "4";

#############
$serveur_nom = "Paris BBR";
$serveur_url = "https://paris.testdebit.info/dl/262144000.iso";
#curl ($type_test, $serveur_proto, $serveur_http, $serveur_url, $serveur_nom);
#`/bin/sleep 20`;


############# Fermeture du fichier de log et supression du fichier #############
close LOG || die "===> Kill (à la fin du programme) : Problème à la fermeture du fichier de log $LOGFILE_NAME : $!";

C'est trés flexible, avec la possibilité bien sur de faire des tests sans rajouter de latence vers différents serveurs si on souhaite comparer diffétents serveurs.

On peut aussi utiliser ce script pour comparer l'impact de la taille d'un fichier.

Tout ce qui est date est là pour donner des informations si par exemple le script est lancé chaque heure à distination de serveurs pour grapher le débit dans le temps.

Un graphe croisé dynamique avec Excel permet ensuite de travailler efficacement sur les données.

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Script pour automatiser des tests descendant / monant avec Curl
« Réponse #2 le: 23 août 2022 à 16:05:03 »
J'utilise la ligne de commande `sudo tc qdisc change dev $interface root netem delay 4ms`; pour simuler de la latence.

Afin de ne pas avoir la demande de mot de passe à rentrer, il faut mettre la ligne suivante dans visudo :

vgu     ALL=(ALL) NOPASSWD: /usr/sbin/tc

Il faut donc taper sudo visudo et rajouter la ligne par exemple sous "# Allow members of group sudo to execute any command".

zergflag

  • Abonné Bbox fibre
  • *
  • Messages: 1 944
Script pour automatiser des tests descendant / monant avec Curl
« Réponse #3 le: 23 août 2022 à 16:52:58 »
Par contre ton script après l'avoir exécuté on fait comment pour revenir à la latence normal ? parce que là je suis rester bloquer à 1000

EDIT : c'est bon c'est sudo tc qdisc change dev "interface" root netem delay 0ms

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Script pour automatiser des tests descendant / monant avec Curl
« Réponse #4 le: 23 août 2022 à 17:01:09 »
Un sudo tc qdisc change dev "interface" root netem delay 0ms ou un reboot : l'augmentation de latence n'est pas remise en place après un redémarrage du PC.

Pour en savoir plus : Tutoriel pour générer des pertes de paquets / latence / gigue sur un équipement avec NetEm

zergflag

  • Abonné Bbox fibre
  • *
  • Messages: 1 944
Script pour automatiser des tests descendant / monant avec Curl
« Réponse #5 le: 23 août 2022 à 17:02:17 »
Un sudo tc qdisc change dev "interface" root netem delay 0ms ou un reboot : l'augmentation de latence n'est pas remise en place après un redémarrage du PC.

Pour en savoir plus : Tutoriel pour générer des pertes de paquets / latence / gigue sur un équipement avec NetEm

OK c'est bon à savoir