La Fibre
Télécom => Logiciels et systèmes d'exploitation => Iperf => Discussion démarrée par: darkmoon le 05 janvier 2020 à 16:06:28
-
Suite à la demande de Vivien (https://lafibre.info/1gb-free/serveur-iperf3-chez-free/msg720432/#msg720432), j'ai bricolé un petit truc pour tracer les graphes iperf via munin.
Comme je ne désire pas tester les performances toutes les 5 mn, le script est coupé en 2 :
- une partie fait le test de vitesse et écrit le résultat toutes les 30 mn,
- l'autre partie est gérée par munin.
Partie 1 : Test de vitesse :
iperf_munin.sh
#!/bin/bash
sleep $[ ( $RANDOM % 20 ) + 15 ]s
down=`iperf3 -f m -c bouygues.iperf.fr -p 5206 -6 -R -P8 -O 2 -t 8\
| grep Mbits \
| cut -d ' ' -f 14 \
| sed '{$!d;}'`
if [ "$down" = "" ]
then
exit
else
echo "down.value $down" > /etc/munin/iperf.down
fi
up=`iperf3 -f m -c bouygues.iperf.fr -p 5206 -6 -P4 -O 2 -t 10\
| grep Mbits \
| cut -d ' ' -f 13 \
| sed '{$!d;}'`
if [ "$up" = "" ]
then
exit
else
echo "up.value $up" > /etc/munin/iperf.up
fi
Ce dernier est placé dans un cron pour être lancé toutes les 30 mn :
7,37 * * * * /usr/bin/iperf_munin.sh > /dev/null 2>&1
Partie 2 : Munin
Il faut ensuite ajouter le script suivant à Munin :
#!/bin/bash
#
# iperf_ munin grabber script
# use it with iperf_munin.sh and set it with a 30mn cronjob
# 2019 moondark
if [ "$1" = "config" ]; then
echo "graph_title iperf to bouygues.iperf.fr"
echo 'graph_vlabel Mbits/sec'
echo 'graph_args --base 1000 --lower-limit 0 --upper-limit 1000 --rigid --units-exponent 2'
echo 'graph_category network'
echo 'graph_period second'
echo "graph_info This instance of iperf measures the transmit speed to bouygues.iperf.fr"
echo 'down.label DownSpeed'
echo 'down.draw AREA'
echo 'up.label UpSpeed'
echo 'up.draw LINE1'
else
echo "$(</etc/munin/iperf.down)"
echo "$(</etc/munin/iperf.up)"
fi
L'avantage de séparer en deux, c'est que le test n'est pas fait directement par munin.
C'est également disponible sur Github (https://github.com/mooondark/munin-iperf)
Si vous savez/voyez comment améliorer ça, je suis preneur.
-
J'ai une proposition pour éviter de faire le test au début de la minute où le serveur est le plus chargé :
#### Pause aléatoire : de 20 secondes à 5 minutes max
sleep $[ ( $RANDOM % 260 ) + 20 ]s
On évite systématiquement les 20 premières secondes et les 20 dernières secondes d'un intervalle de 5 minutes (300 secondes) et ensuite il y a de l'aléatoire pour le lancement dans le créneau de 5 minutes (260 secondes restantes vu que l'on exclues les 20 premières et les 20 dernières).
Je ne publie pas les stats de la charge du serveur en temps réel pour éviter le jeu de saturer le serveur, mais je peut les donner sur demande. Le débit consommé subit de très fortes variations et est très instable.
-
Je débute avec munin, donc je viens de l'installer et ai mis ton 2e script sous le nom "iperf" dans le répertoire /etc/munin/plugins
Par contre j'avais une erreur [WARNING] 2 lines had errors while 0 lines were correct (100.00%) in data from 'fetch iperf' on localhost.localdomain/127.0.0.1:4949
J'ai donc modifié le 1er script en virant iperf devant up et down :
#!/bin/bash
#### Pause aléatoire : de 20 secondes à 5 minutes max
sleep $[ ( $RANDOM % 260 ) + 20 ]s
down=`iperf3 -f m -c bouygues.iperf.fr -p 5205 -4 -R -P4 -t 10\
| grep Mbits \
| cut -d ' ' -f 12 \
| sed '{$!d;}'`
echo "down.value $down" > /etc/munin/iperf.down
up=`iperf3 -f m -c bouygues.iperf.fr -p 5205 -4 -P3 -O 2 -t 10\
| grep Mbits \
| cut -d ' ' -f 13 \
| sed '{$!d;}'`
echo "up.value $up" > /etc/munin/iperf.up
Et maintenant ça marche, j'ai enfin la courbe.
-
Bizarre, mais le principal c'est que cela fonctionne maintenant ;)
-
Si on veut se passer d'iperf et le faire avec curl c'est également possible. Il suffit de changer le 1er script par celui-ci :
#!/bin/bash
down=`curl -s -4 http://bouygues.testdebit.info/1G.iso -o /dev/null -w "%{speed_download}" | cut -d',' -f1`
up=`curl -s -4 --max-time 15 -k -o /dev/null -F "filecontent=@/var/www/temp.iso" http://bouygues.testdebit.info -w "%{speed_upload}" | cut -d',' -f1`
convert=125000
echo "down.value $((down/convert))" > /etc/munin/iperf.down
echo "up.value $((up/convert))" > /etc/munin/iperf.up
Ça à l'avantage de pas tomber un moment ou le serveur est déjà occupé ...
-
Pour le débit descendant, je privilégierait un test sur une durée fixe avec un fichier de 10 Go. Cela permet de s'adapter automatiquement a toutes les connexions.
Une durée de 8 secondes est suffisant pour avoir un débit moyen proche du débit maximal.
down=`curl -s -4 --max-time 8 http://bouygues.testdebit.info/10G.iso -o /dev/null -w "%{speed_download}" | cut -d',' -f1`
Curl permet également d'exclure le temps de la connexion TCP et de ne prendre le débit qu'entre le premier et le dernier paquet reçu.
Ce choix est encore plus important en https, vu qu'il faut plusieurs échanger pour monter TLS.
-
Bien vu, je n'avais pas pensé à ça !
-
Voici ce que cela donne comme graphique : (merci darkmoon)
(https://lafibre.info/images/free_debit/202001_munin_iperf3_free_week.png)
L'augmentation de l'upload début octobre est lié à la migration Orange => Free
(https://lafibre.info/images/free_debit/202001_munin_iperf3_free_year.png)
-
J'ai modifié mon script iperf pour les nouveaux ports :
#!/bin/bash
SERVER=bouygues.iperf.fr
PORT=9200
RANGE=23
MAXCOUNT=30
SLEEP=10s
#### Pause aléatoire : de 20 secondes à 5 minutes max
sleep $[ ( $RANDOM % 260 ) + 20 ]s
TEMPPORT=$PORT
COUNT=0
while (($COUNT < $MAXCOUNT));
do
down=`iperf3 -f m -c $SERVER -p $TEMPPORT -6 -R -P4 -O 2 -t 4 \
| grep Mbits \
| tail -1 \
| sed 's/\s\s*/ /g' \
| cut -d' ' -f6`
[ -z "$down" ] || break;
if (( $TEMPPORT < $PORT+$RANGE-1)) ; then
TEMPPORT=$((TEMPPORT + 1))
else
TEMPPORT=$PORT
COUNT=$((COUNT + 1))
sleep $SLEEP
fi
done
[ -z "$down" ] || echo "down.value $down" > /etc/munin/iperf.down
TEMPPORT=$PORT
COUNT=0
while (($COUNT < $MAXCOUNT));
do
up=`iperf3 -f m -c $SERVER -p $TEMPPORT -6 -P 4 -O 2 -t 4 \
| grep Mbits \
| tail -1 \
| sed 's/\s\s*/ /g' \
| cut -d' ' -f6`
[ -z "$up" ] || break;
if (( $TEMPPORT < $PORT+$RANGE-1)) ; then
TEMPPORT=$((TEMPPORT + 1))
else
TEMPPORT=$PORT
COUNT=$((COUNT + 1))
sleep $SLEEP
fi
done
[ -z "$up" ] || echo "up.value $up" > /etc/munin/iperf.up
Si c'est trop agressif pour le serveur, je peux le modifier ou l'effacer ;-)
J'utilise aussi le script avec curl (entre chez moi et mon dédié mais j'ai changé l'url ;-)) :
#!/bin/bash
down=`curl -s -6 --max-time 8 http://bouygues.testdebit.info/10G.iso -o /dev/null -w "%{speed_download}" |cut -d',' -f1`
up=`curl -s -6 --max-time 8 -k -o /dev/null -F "filecontent=@/home/esver/10G.iso" http://bouygues.testdebit.info/ -w "%{speed_upload}" | cut -d',' -f1`
###Result in KiB/s => 1000*1000*1000/(1024*8) = 122070 => MB/s
convert=122070
echo "down.value $((down/convert))" > /etc/munin/iperfcurl.down
echo "up.value $((up/convert))" > /etc/munin/iperfcurl.up
Par contre je ne comprenais pas le convert=125000 donc j'ai mis mon calcul.
Edit: utilisation de tail pour la dernière ligne, sed pour supprimer les espaces consécutifs et cut pour sélectionner la valeur.
-
Je me demande si il ne serait pas pertinent d'utiliser l'option -O d'iPerf3 pour ne pas prendre en compte le slow start.
L'option -O 4 permet de ne pas prendre en compte les 4 premières secondes du test dans le débit moyen. On est large en prenant 4 secondes, normalement la montée en débit est plus courte avec une seule connexion TCP. Le fait de mettre plusieurs connexion TCP en parallèle fait que cela va monter plus vite.
Comme tu parle de ressource serveurs, je serais également pour limiter le test (-t) à 4 secondes et ne pas prendre en compte le slow start. Il y a très peu de gain à faire plus de 8 secondes (dont 4 exclues) et c'est 20% de test en moins. Pour ceux qui sont sur une durée de 20 secondes ::) les tests sont quand même très impactant pour le serveur.
Dans mon hypothèse, le débit moyen serait calculé entre la 4ème et la 8ème seconde du test.
4 seconde c'est largement suffisant pour avoir une donnée fiable.
Maintenant n'hésitez pas a donner votre avis sur ces propositions.
-
Perso j'utilise déjà -O 2 et -t 8 comme dans le script d'origine. C'est largement suffisant.
J'avais fait des tests et 4 secondes d'omission, cela n'apporte rien, 2 secondes ça permet de faire le taff.
-
Je ne sais pas pourquoi j'avais modifié le script, je recolle au premier, en mettant -O 2 pour ignorer les 2 premières secondes et -t 4 pour faire les tests sur 4 secondes, ce qui fait un test sur 6 secondes au total.
Je verrai si il faut changer.
-
J'ai un souci avec un plugin que j'ai crée, je n'arrive pas à avoir des logs pour comprendre pourquoi mon graphique reste vide...
J'ai un plugin capable de générer deux graphiquies :
- ln -s /usr/share/munin/plugins/ubuntu_support_ /etc/munin/plugins/ubuntu_support_total => Statistiques des versions d’Ubuntu
- ln -s /usr/share/munin/plugins/ubuntu_support_ /etc/munin/plugins/ubuntu_support_percent => Répartition des versions d’Ubuntu
Le script munin va chercher des données qui sont dans un fichier .csv "Open data" qui est mis à jour chaque matin.
#!/bin/bash
# License: GPLv2
# Author: Vivien Guéant
FILE_STAT_NB=/home/ubuntu-archive/stats/open-data/consolidated_statistics_ubuntu-fr_nb.csv
FILE_STAT_PCT=/home/ubuntu-archive/stats/open-data/consolidated_statistics_ubuntu-fr_pct.csv
type=`cut -d "_" -f 2 <<< "$0"`
if [ "$1" == "config" ]
then
if [ "$type" = "total" ]
then # Separate computers
cat <<'EOF'
graph_title Statistiques des versions d’Ubuntu
graph_vlabel Nombre d’ordinateurs distincts
graph_category ubuntu
graph_args --base 1000 --upper-limit 100 -l 0
support.label Utilisateurs de versions d'Ubuntu pris en charge
support.min 0
support.type DERIVE
support.draw AREA
end.label end bps
end.min 0
end.type DERIVE
end.draw STACK
total.label Total bps
total.min 0
total.type DERIVE
total.draw LINE1
EOF
else # Percentage
cat <<'EOF'
graph_scale no
graph_title Répartition des versions d’Ubuntu
graph_vlabel Pourcentage des ordinateurs utilisant Ubuntu
graph_category ubuntu
graph_args --upper-limit 100 -l 0 -r
support.label % versions d'Ubuntu pris en charge
support.min 0
support.draw AREA
end.label end %
end.min 0
end.draw STACK
EOF
fi
else
if [ "$type" = "total" ]
then # Separate computers
echo "support.value `tail -n 1 $FILE_STAT_NB | cut -d ',' -f 4 | cut -d '"' -f 2`"
echo "end.value `tail -n 1 $FILE_STAT_NB | cut -d ',' -f 3 | cut -d '"' -f 2`"
echo "total.value `tail -n 1 $FILE_STAT_NB | cut -d ',' -f 2 | cut -d '"' -f 2`"
else # Percentage
echo "support.value `tail -n 1 $FILE_STAT_PCT | cut -d ',' -f 4 | cut -d '"' -f 2`"
echo "end.value `tail -n 1 $FILE_STAT_PCT | cut -d ',' -f 3 | cut -d '"' -f 2`"
fi
fi
Quand j’exécute à la main mes script, j'ai bien les bonnes données :
$ sudo munin-run ubuntu_support_total
support.value 672014
end.value 187919
total.value 859933
$ sudo munin-run ubuntu_support_percent
support.value 78.147
end.value 21.852
Coté graphique,
Celui sur les données sans pourcentage reste vide sans que je comprenne pourquoi.
(https://ubuntu.lafibre.info/stats/images/fr_archive_ubuntu_ubuntu_support_total-month.png)
Ceui sur les pourcetage est ok :
(https://ubuntu.lafibre.info/stats/images/fr_archive_ubuntu_ubuntu_support_percent-month.png)
-
Le --upper-limit 100 n'est pas bon, mais je ne sais pas si c'est ça qui casse aussi les statistiques en dessous du graphe (peut-être qu'il ignore les données hors de l'intervalle affiché).
-
Trouvé, c'est le "xxxxx.type DERIVE" qui fait la différence entre la valeur n et la valeur n-1.
Sans que je comprenne pourquoi, cela fonctionne bien avec graph_args --base 1000 --upper-limit 100 -l 0