iperf: diagnostic de bandwidth
Bonjour à tous et avant toute chose Bonne Année 2013 !
Aujourd’hui, je vous propose un petit rappel sur un outil incontournable et pourtant facilement occulté par d’autres s’appuyant sur des GUI.
Iperf est un outil de diagnostic de performance et de qualité de la bande passante entre 2 hosts. Ayant prouvé son utilité, il est le plus souvent présent sur les dépôts officiels des distributions et s’utilise en ligne de commande.
Utilisation
Iperf offre plusieurs alternatives pour la mesure : port sur lequel opérer la mesure (par défaut le 5001 en TCP), TCP ou UDP, intervalle entre les requêtes, en ipv6 ou pas, bref un éventail satisfaisant d’option pour triturer convenablement le lien.
Le fonctionnement de base s’appuie sur le dialogue entre 2 instances, une sur le noeud client et une sur le noeud serveur.
Ici pour l’exemple, le client, c’est-à-dire celui qui initie la requête, sera lab-client, en 192.168.133.103/24. Le serveur, un autre noeud sur lequel on enverra les requêtes sera identifié en tant que lab-server, IP 192.168.133.101.
On commence par démarrer iperf en mode foreground server sur lab-server, afin qu’il puisse ouvrir et écouter le port 5001, qui est celui utilisé par défaut. On peut choisir un autre port, il suffit de l’indiquer à iperf.
[root@lab-server~]# iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------
Le service attend une requête. Pou rcela, il faut démarrer de manière similaire iperf sur lab-client afin qu’il requête lab-server en mode client sur le bon port :
root@lab-client:~# iperf -c lab-server ------------------------------------------------------------ Client connecting to lab-server, TCP port 5001 TCP window size: 16.0 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.133.103 port 45579 connected with 192.168.133.101 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 114 MBytes 94.9 Mbits/sec
L’échange est fait et les statistiques sont visibles sur lab-client. Sur lab-server, les informations tombent dès la connexion de lab-client :
[root@lab-server~]# iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------ [ 4] local 192.168.133.101 port 5001 connected with 192.168.133.103 port 45579 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.1 sec 114 MBytes 93.9 Mbits/sec
Dans le principe, si le port sur lequel on veut taper est écouter il n’y as pas besoin de lancer iperf en mode client sur la target, on aura quand même nos statistiques.
root@lab-client:~# iperf -f M -m -c lab-server -p 22 ------------------------------------------------------------ Client connecting to lab-server, TCP port 22 TCP window size: 0.02 MByte (default) ------------------------------------------------------------ [ 3] local 192.168.133.103 port 37228 connected with 192.168.133.101 port 22 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 17592186044377 MBytes 1759212799036 MBytes/sec [ 3] MSS size 1448 bytes (MTU 1500 bytes, ethernet)
Le –help renvoie un listing complet et succinct des options à votre disposition si vous voulez jouer davantage.
[root@lab-client ~]# iperf --help Usage: iperf [-s|-c host] [options] iperf [-h|--help] [-v|--version] Client/Server: -f, --format [kmKM] format to report: Kbits, Mbits, KBytes, MBytes -i, --interval # seconds between periodic bandwidth reports -l, --len #[KM] length of buffer to read or write (default 8 KB) -m, --print_mss print TCP maximum segment size (MTU - TCP/IP header) -o, --outputoutput the report or error message to this specified file -p, --port # server port to listen on/connect to -u, --udp use UDP rather than TCP -w, --window #[KM] TCP window size (socket buffer size) -B, --bind bind to , an interface or multicast address -C, --compatibility for use with older versions does not sent extra msgs -M, --mss # set TCP maximum segment size (MTU - 40 bytes) -N, --nodelay set TCP no delay, disabling Nagle's Algorithm -V, --IPv6Version Set the domain to IPv6 Server specific: -s, --server run in server mode -U, --single_udp run in single threaded UDP mode -D, --daemon run the server as a daemon Client specific: -b, --bandwidth #[KM] for UDP, bandwidth to send at in bits/sec (default 1 Mbit/sec, implies -u) -c, --client run in client mode, connecting to -d, --dualtest Do a bidirectional test simultaneously -n, --num #[KM] number of bytes to transmit (instead of -t) -r, --tradeoff Do a bidirectional test individually -t, --time # time in seconds to transmit for (default 10 secs) -F, --fileinput input the data to be transmitted from a file -I, --stdin input the data to be transmitted from stdin -L, --listenport # port to receive bidirectional tests back on -P, --parallel # number of parallel client threads to run -T, --ttl # time-to-live, for multicast (default 1) -Z, --linux-congestion set TCP congestion control algorithm (Linux only) Miscellaneous: -x, --reportexclude [CDMSV] exclude C(connection) D(data) M(multicast) S(settings) V(server) reports -y, --reportstyle C report as a Comma-Separated Values -h, --help print this message and quit -v, --version print version information and quit [KM] Indicates options that support a K or M suffix for kilo- or mega- The TCP window size option can be set by the environment variable TCP_WINDOW_SIZE. Most other options can be set by an environment variable IPERF_ , such as IPERF_BANDWIDTH. Report bugs to
Conclusion
Iperf est un outil indispensable et démontre son utilité dans tous les cas, que cela soit dans une optique de troubleshooting ou bien d’évolution d’infrastructure.