Auteur Sujet: Plugin munin pour iperf3  (Lu 5987 fois)

0 Membres et 1 Invité sur ce sujet

darkmoon

  • Abonné Free fibre
  • *
  • Messages: 728
  • ↓ 5 Gbps | ↑ 700Mbps (SGL 69)
Plugin munin pour iperf3
« 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

Si vous savez/voyez comment améliorer ça, je suis preneur.
« Modifié: 10 janvier 2020 à 10:20:56 par darkmoon »

vivien

  • Administrateur
  • *
  • Messages: 46 992
    • Twitter LaFibre.info
Plugin munin pour iperf3
« Réponse #1 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.

esver

  • Abonné Free fibre
  • *
  • Messages: 73
  • Quimper (29)
    • Blog
Plugin munin pour iperf3
« Réponse #2 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.

darkmoon

  • Abonné Free fibre
  • *
  • Messages: 728
  • ↓ 5 Gbps | ↑ 700Mbps (SGL 69)
Plugin munin pour iperf3
« Réponse #3 le: 08 janvier 2020 à 10:33:07 »
Bizarre, mais le principal c'est que cela fonctionne maintenant  ;)

darkmoon

  • Abonné Free fibre
  • *
  • Messages: 728
  • ↓ 5 Gbps | ↑ 700Mbps (SGL 69)
Plugin munin pour iperf3
« Réponse #4 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é ...

vivien

  • Administrateur
  • *
  • Messages: 46 992
    • Twitter LaFibre.info
Plugin munin pour iperf3
« Réponse #5 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.

darkmoon

  • Abonné Free fibre
  • *
  • Messages: 728
  • ↓ 5 Gbps | ↑ 700Mbps (SGL 69)
Plugin munin pour iperf3
« Réponse #6 le: 09 janvier 2020 à 14:36:22 »
Bien vu, je n'avais pas pensé à ça !

vivien

  • Administrateur
  • *
  • Messages: 46 992
    • Twitter LaFibre.info
Plugin munin pour iperf3
« Réponse #7 le: 24 janvier 2020 à 14:08:19 »
Voici ce que cela donne comme graphique : (merci darkmoon)


L'augmentation de l'upload début octobre est lié à la migration Orange => Free


esver

  • Abonné Free fibre
  • *
  • Messages: 73
  • Quimper (29)
    • Blog
Plugin munin pour iperf3
« Réponse #8 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.
« Modifié: 30 janvier 2020 à 09:22:12 par esver »

vivien

  • Administrateur
  • *
  • Messages: 46 992
    • Twitter LaFibre.info
Plugin munin pour iperf3
« Réponse #9 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.

darkmoon

  • Abonné Free fibre
  • *
  • Messages: 728
  • ↓ 5 Gbps | ↑ 700Mbps (SGL 69)
Plugin munin pour iperf3
« Réponse #10 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.

esver

  • Abonné Free fibre
  • *
  • Messages: 73
  • Quimper (29)
    • Blog
Plugin munin pour iperf3
« Réponse #11 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.
« Modifié: 30 janvier 2020 à 09:19:06 par esver »