La Fibre

Télécom => Logiciels et systèmes d'exploitation => testdebit Iperf => Discussion démarrée par: darkmoon le 05 janvier 2020 à 16:06:28

Titre: Plugin munin pour iperf3
Posté 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.
Titre: Plugin munin pour iperf3
Posté par: vivien le 05 janvier 2020 à 16:43:00
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.
Titre: Plugin munin pour iperf3
Posté par: esver le 06 janvier 2020 à 18:11:08
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.
Titre: Plugin munin pour iperf3
Posté par: darkmoon le 08 janvier 2020 à 10:33:07
Bizarre, mais le principal c'est que cela fonctionne maintenant  ;)
Titre: Plugin munin pour iperf3
Posté par: darkmoon le 09 janvier 2020 à 11:03:46
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é ...
Titre: Plugin munin pour iperf3
Posté par: vivien le 09 janvier 2020 à 14:32:01
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.
Titre: Plugin munin pour iperf3
Posté par: darkmoon le 09 janvier 2020 à 14:36:22
Bien vu, je n'avais pas pensé à ça !
Titre: Plugin munin pour iperf3
Posté par: vivien le 24 janvier 2020 à 14:08:19
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)
Titre: Plugin munin pour iperf3
Posté par: esver le 29 janvier 2020 à 16:18:14
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.
Titre: Plugin munin pour iperf3
Posté par: vivien le 29 janvier 2020 à 18:05:45
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.
Titre: Plugin munin pour iperf3
Posté par: darkmoon le 29 janvier 2020 à 20:36:13
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.
Titre: Plugin munin pour iperf3
Posté par: esver le 29 janvier 2020 à 21:31:15
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.
Titre: Plugin munin pour iperf3
Posté par: vivien le 07 février 2020 à 21:56:48
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)
Titre: Plugin munin pour iperf3
Posté par: hwti le 08 février 2020 à 00:06:32
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é).
Titre: Plugin munin pour iperf3
Posté par: vivien le 08 février 2020 à 10:27:03
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