Tester la performance de votre réseau avec Iperf

Date: 9/03/2007 | Catégories: Reseau | Tags: ,,,,,

Iperf est un des outils indispensable pout tout administrateur réseau qui se respecte. En effet, ce logiciel de mesure de performance réseau, diponible sur de nombreuses plateformes (Linux, BSD, Mac, Windows...), se présente sous la forme d'une ligne de commande à executer sur deux machines disposées aux extrémités du réseau à tester.

Iperf fonctionne comme un client/serveur selon le diagramme suivant:

Iperf

Iperf doit être lancé sur deux machines se trouvant de part et d'autre du réseau à tester. La première machine lance Iperf en "mode serveur" (avec l'option -s), la seconde en "mode client" (option -c). Par défaut le test réseau se fait en utilsant le protocole TCP (mais il est également possible d'utiliser le mode UDP avec l'option -u).

Nous allons commencer par installer iperf en utilisant la commande suivante (sous Fedora):

# yum install iperf

Pour les autres système d"exploitation, vous pouvez vous rendre sur cette page.

Premier exemple d'utilisation

Ensuite, sur une des deux machines de test, nous allon slancer le serveur grâce à la commande suivante:

# iperf -s

Sur le client, il ne reste plus qu'a lancer le client en précisant l'adresse du serveur:

# iperf -c <adresse IP du serveur>

Vous devriez avoir le rapport qui s'affiche après 10 secondes de test.

------------------------------------------------------------
Client connecting to 192.168.29.1, TCP port 5001
TCP window size: 65.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.29.157 port 50675 connected with 192.168.29.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 110 MBytes 92.6 Mbits/sec

Avec les options par défaut, le test est fait en TCP sur une durée de 10 secondes. Sur un réseau local vous devriez donc obtenir un valeur proche de la capacité de commutation de vos équipements (par exemple 92.6 Mbits/sec qui est une valeur proche de 100 Mbits/sec).

Pour afficher des rapports intermédiaires (par exemple toutes les secondes) , il suffit d'ajouter l'option (-i 1) sur le client et/ou le serveur.

# iperf -s -i 1
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 56.0 KByte (default)
------------------------------------------------------------
[ 6] local 192.168.29.1 port 5001 connected with 192.168.29.157 port 50692
[ 6] 0.0- 1.0 sec 10.1 MBytes 84.8 Mbits/sec
[ 6] 1.0- 2.0 sec 11.1 MBytes 93.0 Mbits/sec
[ 6] 2.0- 3.0 sec 11.2 MBytes 93.8 Mbits/sec
[ 6] 3.0- 4.0 sec 11.2 MBytes 93.9 Mbits/sec
[ 6] 4.0- 5.0 sec 11.2 MBytes 93.9 Mbits/sec
[ 6] 5.0- 6.0 sec 11.2 MBytes 93.8 Mbits/sec
[ 6] 6.0- 7.0 sec 11.2 MBytes 93.9 Mbits/sec
[ 6] 7.0- 8.0 sec 11.2 MBytes 93.8 Mbits/sec
[ 6] 8.0- 9.0 sec 11.2 MBytes 93.9 Mbits/sec
[ 6] 9.0-10.0 sec 11.2 MBytes 93.9 Mbits/sec
[ 6] 0.0-10.0 sec 111 MBytes 92.9 Mbits/sec

Une autre option de base est (-t) qui permet de fixer au niveau du client le temps du test (en secondes). Par exemple pour effectuer un test pendant 1 minute:

# ipert -c <adresse IP du serveur> -t 60

Exemple de test en utilisant le protocole UDP

Iperf permet également de générer un traffic de type UDP (-u). Dans ce cas là, il faut penser à fixer la bande passante cible (contrairement au protocole TCP, UDP ne peut pas faire de contrôle de flux). On utilise pour cela l'argument -b au niveau du client:

Sur le serveur:

# iperf -s -u

Sur le client:

# ipert -c <adresse IP du serveur> -u -b 512k

Ce couple de commandes va générer un test avec un flux réseau UDP de 512 Kbits/sec.

Comme vous pouvez le voir Iperf est également un bon outil de génération de flux. Je l'ai déjà testé pour générer un flux UDP constant pendant plusieurs jours.

Exemple de test en multicast (UDP)

Iperf peut fonctionner en mode multicast (-B). Il faut le lancer de la manière suivante:

Sur le serveur:

# iperf -s -u -B 226.10.11.12

Sur le/les clients:

# iperf -c 226.10.11.12 -u -T 32 -b 512k

Ce couple de commandes génére un flux multicast UDP (sur l'adresse 226.10.11.12, avec un TTL de 32) de 512 Kbits/sec.

Autres options

NOUVEAU: Consultez cet autre article (cliquez ici) pour une description des options avancés de Iperf.

Et bien entendu, il reste la fameuse commande:

# iperf --help

...pour avoir la liste complète des options. Si vous avez des questions, n'hésitez pas !

Sur le même sujet

Pour mes propres besoins, j'ai ecrit un programme nommé SJitter permettant, comme le fait Iperf (c'est à dire sous la forme d'un client/serveur), de mesurer la gigue réseau (ou jitter en anglais). Paramètre très important si vous souhaitez mettre en place de la voie sur IP sur votre réseau.

  • Suite au mail d’un lecteur:
    la qualité d’un lien réseau peut être caractérisée par plusieurs variables:
    – taux de perte de paquets (iperf peut te donner cette information)
    – délais de transit (iperf peut te donner cette information)
    – valeur de la gigue (tu peux la calculer en fonction des informations donnée par Iperf avec l’option -i ou bien utiliser un autre logiciel comme SJitter qui te donnera une valeur moyenne)

    En fonction de ton réseau tu peux en déduire si tu as un problème ou pas. Quelques exemples:
    Sur un réseau local: Perte < 0.5%, délais < 10 ms, Gigue < 5 ms Sur un réseau Wan: Perte < 1%, délais < 40 ms, Gigue < 10 ms Sur Internet (ou VPN sur Internet): Perte < 2%, délais < 100 ms, Gigue < 30 ms

  • monalisa

    je voulais savoir si il ya une possiblité de prgrammer en java des requettes iperf avec un model client serveur?

  • @monalisa: à ma connaissance, il n’y a pas de version java d’Iperf mais seulement une interface utilisateur ecrite en Java pour lancer Iperf. Bref la seule solution à ton problème est de lancer depuis ton code java la commande systeme iperf.

  • monalisa

    merci nicoLargo,
    Pour les besoins de mon projet je pense que SJitter est plus intéressant que Iperf, mais je ne sais pas comment je doit faire pour récupérer les données quand j’envoie une requête SJitter ,
    je m’explique: dans mon projet je doit développer une application de monitoring sur un réseau, en java, donc je doit interroger des machines a distance, j’ai penser a installer SJitter sur le serveur et développer une commande avec java qui me permet de lancer SJitter vers des utilisateurs sur le réseau déjà identifier (avec l’adresse IP), mais je ne sais pas comment faire pour récupérer ces données pour les analyser avec la même application java.
    (si y a moyen que SJitter enregistre les données récupérer sur un fichier .txt ( par exemple )pour que je puisse faire la lecture avec mon application sur ce fichier?)
    crd,

  • @monalisa: sjitter comme iperf sont des outils de test de performance réseau mais pas des applications de monitoring. Mais si tu veux les utiliser quand même pour controler l’evolution des caractéristiques d’un lien à travers le temps, tu peux lancer sjitter dans une commande système et rediriger la sortie vers un fichier texte.

    Par exemple:
    # sjitter -c -n 100 -b 200 > /tmp/output.txt

    Il ne reste plus alors qu’a analyser la sortie du fichier .txt avec ton programme java.

  • monalisa

    bonjour,
    j’ai suivi les instructions a la lettre, est ça marche trés bien merci bc.
    mais je voulais savoir si je peut lancer iperf sur des routeur Cisco?
    si non, y a t’il un moyen pour tester est recuperer les valeurs que je cherche (taux de perte de paquets, délais de transit, la gigue).

  • #monalisa: il n’existe pas de serveur (ni de client ) comme Iperf ou Sjitter pouvant être lancé sur les IOS des routeurs Cisco. Ta seule chance est d’utiliser des requêtes SNMP mais je doute que tu trouves ces informations dans la MIB Cisco.

    Les routeurs font parties de l’infrastructure réseau, au même titre que les switchs et les modems. Le plus simple est d’installer un client/serveur (Iperf ou Sjitter) sur une machien derriere ton routeur pour tester ton lien.

  • monalisa

    bonjour,
    une question sur iperf, sous unix on utilisant la commande awk comme l’exemple :
    iperf -c `@serveur` -u -t280 -b16K -S0x88 | awk ‘/%/ {sub(/%/, » »,$13) ; sub(/\(/, » »,$13) ; sub(/\)/, » »,$13) ; {print $9,$13}}’ > $HOME/result/iperf
    je peut recuperer les valeurs est les enregister sur une base de donnée (postgres).
    mais le probleme que j’ai eu c’est pour le serveur (iperf -s), puisque le serveur reste a l’ecoute du port jusqu’a a ce qu’on arrete le process
    mais je demande si vous avez un script ou connaisser un moyen pour integrer directement les mesures recolté sur une base de donnée sans passer par un fichier txt
    merci

  • @monalisa: il n’existe pas à ma connaissance de moyen pour rediriger automatiquement des resultats d’un Iperf vers une base de donnée. Il faut comme tu l’as fais passer par un script. Par contre je pense qu’il serait plus propre de passer par un script Perl qui te permettra de lancer Iperf (via une commande system()) et de recuperer le resultat dans une socket que tu pourras intégrer directement dans une base de donnée (par exemple en utilisant la librairie DBI).

    Je n’ai rien sous le coude… il va falloir que tu codes par toi même…

  • j’ai un routeur wifi(borne wifi) et un pc portable.
    Je voudrais générer untrafiic de ce pc et qui fait un boucle pour revenir au même pc.
    le pc et le routeur relié au un reseau local .

  • @MMZ: Si j’ai bien compris, tu veux essayer de tester ta connectivité Wifi avec 1 seul PC… Le plus simple et je pense la seule solution (mais je peux me tromper) est de brancher ton portable avec un cable Ethernet sur ton routeur Wifi et de te connecter en même temps en Wifi sur ta borne. Decalre deux adresse IP différentes sur ton interface Wifi et ton interface Ethernet. Tu devrais alors pouvoir faire les tests entre ces deux interfaces et donc en déduire la qualité Wifi de ta borne.

  • rahma

    est ce que je peux utiliser sjitter sur windows?
    Quelle est la formule à utiliser pour calculer le gigue en utilisant iperf?
    merci

  • Je ne pense pas adapter Sjitter sous WIndows pour l’instant. Je logiciel étant sous licence libre, si quelqu’un a l’envie de le faire il n’y a aucun problème…

    Iperf permet avec l’option -i de données l’écart de réception entre deux paquets. Il faut ensuite prendre ces valeurs et lui appliquer le calcul décrit dans la RFC 1889.

  • Pingback: E-jul.com » Quelques outils open-source pour administrer son réseau()

  • MANO

    Bonjour
    j’utlise iperf 2.0 sur windows, quand je tape :
    iperf -s -u -B 226.10.11.12
    il me renvoie l’erreur suivante:
    bind failed: cannot assign requested adress
    multicast join failed: invalid argument
    recvfrom failed : invalid argument
    pouvez vous m’aider svp.

  • Pingback: IPerf: des exemples…()

  • yam

    Bonjour,

    merci nico pour ce tutoriel très utile !

    je me pose cependant des questions sur les performances de mon réseau…

    est-il normal que Iperf me donne un débit d’environ 950 Mbits/s en unicast et seulement 9.21 Mbits en multicast ?

    voici les commandes utilisée :
    serveur unicast :
    iperf -s -u -l 4000

    client unicast :
    iperf -c 192.168.1.105 -i 1 -u -b 1024M -l 4000

    serveur multicast :
    iperf -s -u -B 226.10.11.12

    client multicast :
    iperf -c 226.10.11.12 -b 1024M -i 1

    les deux ordinateurs sont équipés de carte réseau gigabit et connectés en ethernet à un switch gigabit derrière un routeur 100 Mbps

    merci

    antoine

    • Théoriquement, si j’ai bien compris ta configuration de test, tu devrais avoir les mêmes résultats en unicast et en multicast.

      Seul un équipement de routage inséré entre les deux PC (ce qui n’est pas le cas) pourrait expliquer cette baisse de perf en multicast.

      Un autre point est le fait que tu n’utiles pas l’option -l 4000 dans ton test unicast. Cela ne devrait pas avoir une telle influence mais bon…

      Dernière question toute bête, tu fais bien le test à partir de PC sous GNU/Linux ?

      • yam

        oui les deux ordinateurs sont équipés d’Ubuntu 10.04 (config similaires avec Remastersys)

        ces pertes de débit restent un mystère…

        une autre question mais qui sort du chant d’Iperf, comment envoyer du multicast à un ordinateur derrière un routeur ?
        j’entends par là avoir un ordinateur A dans un sous réseau (en 192.168.1.x) créé par un routeur (Ovis link W54ARv2) lui même connecté (sur son port WAN) à un réseau (en 192.168.4.x) dans lequel il y a un ordinateur B.
        J’arrive bien à envoyer des paquets en unicast de A à B mais pas en multicast (j’ai essayé 224.1.1.1 et 239.1.1.1)…
        Une idée ?

        merci
        yam

  • olivier

    Bonjour NicoLargo,

    Je souhaiterai utiliser iperf en tant que client et serveur sur la même machine.

    Je m’explique : je voudrai lancer le client qui me servirai de générateur de traffic IP, le flux sortirait sur un port ethernet, vers une chaine de test avec des équipements de modulation et démodulation et je voudrai récupérer mon flux initial sur un autre port ethernet pour vérifier que ma chaine fonctionne bien.

    Le but étant de valider ma chaine, de n’utiliser qu’une machine si c’est possible pour générer et réceptionner le traffic IP, en ayant une info sur le taux de perte de paquet.

    Est ce réalisable de mettre le serveur sur eth0 et le client sur eth1 par exemple?

    Merci d’avance

  • Fred

    Bonjour,
    J’ai testé iperf sur mon réseau windows 100,0 Mbits/s.
    J’ai lancé un test de base entre deux machines reliées via switch 100.
    J’obtiens comme résultat:
    [ 3] 0.0-10.4 sec 6.38 MBytes 5.15 Mbits/sec

    Je suis surpris, c’est quand même pas fantastique comme résultat, pourtant je trouve pas etre si mal que cela à l’utilisation.
    Pourriez vous me guidé!
    Merci

  • Pingback: Admin Rezo » Archives » Tester le trafic réseau avec IPerf()

  • Abder

    Bonjour,

    Est il possible de connecter plusieurs clients sur un serveur?
    Je m’explique:
    Sur une machine on a iperf -s
    et sur une autre machine, dans laquelle nous avons plusieurs machines virtuelles, je lance iperf -c vers le serveur.
    thanks for help

    • Oui, Iperf est multi-thread. Par contre attention à bien prendre en compte que la bande passante du serveur sera partagé entre les différents clients…

  • pmass

    Bonjour et merci pour ce tuto.

    J’ai 2 VM virtualbox (Debian 6 x64 et Windows 2008R2), hôte sous FC17. Je n’ai pas les mêmes résultats selon qui a le rôle de client et de serveur (si Windows est le serveur, j’ai bien 1Gbps, mais dans le cas contraire, je n’ai plus que 840Mbps.)

    Merci par avance pour ta réponse.

  • Pingback: iperf jperf « Network System et autre Truc()

  • Pingback: AdminRézo – Tester le trafic réseau avec IPerf()

  • Pingback: Laurent Fourteau (laurentfourteau) | Pearltrees()

  • Pingback: Sites | Pearltrees()

  • Franck CF

    Bonsoir, je voudrais tester le fond de panier de mon switch qui est en Gigabits (8 ports). Sur mon Lan j’ai trois machines et un Server. Comment faire pour lancer un commande en meme temps sur les trois machines et ainsi solicité au moins 4 de ses ports? Merci