Quand il s'agit de bench et de tests de charge le sysadmin est le premier à planifier toutes sortes de plans machiavéliques. Et dans la famille des outils de torture, il y en a un qui est particulièrement amusant: iperf. En plus d'être le cauchemard des NetOps, vous aurez à portée de main la possibilité de tester facilement un réseau et ses capacités entre deux machines.

Vous l'aurez compris, iperf fonctionne en mode client-serveur et permet de mesurer les performances réseau entre ces deux machines. Il est multi-plateforme et ici les tests seront fait sous Ubuntu.

Le paquet est disponible dans les repos Ubuntu mais aussi disponible pour toutes les plateformes à cette adresse https://iperf.fr/iperf-download.php

Installation sous Ubuntu:

# apt install iperf

Tests TCP

Premier test

Dans notre premier test nous allons effectuer un simple test TCP entre les 2 machines.

On lance le serveur sur une des deux machines (-s pour serveur):

# iperf -s

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

Ensuite nous lançons le test côté client (-c pour client):

# iperf -c <IP serveur>

------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.1 port 35122 connected with 192.168.2.2 port 5001

Après 10 secondes par défaut, on peut voir le résultat du test s'afficher côté client et côté serveur.

[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  10.3 GBytes  8.86 Gbits/sec

Dans ce test seul le client a transmis au serveur, il est possible de faire un test bidirectionnel avec l'option -d.

Bidirectionnel et multi streams

Juste avant nous avons fait un test unidirectionnel et single stream, iperf permet de faire des tests Bidirectionnel et multistreams. Ainsi on peut valider le réseau dans les deux sens et tenter de saturer le lien (je vous avez dit que c'était amusant).

Du côté du serveur, rien ne change. Côté client on va lancer cette fois-ci avec l'option -d (dual) et -P (parallel).

Test bidirectionnel, 5 streams:

# iperf -c <IP serveur> -d -P 5

L'output nous montre bien que le test est bidirectionnel et parallélisé 5 fois (de chaque côté) pendant 10 secondes.

------------------------------------------------------------
[  9] local 192.168.2.1 port 35324 connected with 192.168.2.2 port 5001
[  6] local 192.168.2.1 port 35316 connected with 192.168.2.2 port 5001
[  5] local 192.168.2.1 port 35318 connected with 192.168.2.2 port 5001
[  7] local 192.168.2.1 port 35320 connected with 192.168.2.2 port 5001
[  8] local 192.168.2.1 port 35322 connected with 192.168.2.2 port 5001
[  4] local 192.168.2.1 port 5001 connected with 192.168.2.2 port 37816
[ 10] local 192.168.2.1 port 5001 connected with 192.168.2.2 port 37818
[ 11] local 192.168.2.1 port 5001 connected with 192.168.2.2 port 37820
[ 12] local 192.168.2.1 port 5001 connected with 192.168.2.2 port 37824
[ 13] local 192.168.2.1 port 5001 connected with 192.168.2.2 port 37822

[ ID] Interval       Transfer     Bandwidth
[  9]  0.0-10.0 sec   694 MBytes   582 Mbits/sec
[  6]  0.0-10.0 sec  1.38 GBytes  1.19 Gbits/sec
[  5]  0.0-10.0 sec  1.29 GBytes  1.11 Gbits/sec
[  7]  0.0-10.0 sec   761 MBytes   638 Mbits/sec
[  8]  0.0-10.0 sec   838 MBytes   702 Mbits/sec
[SUM]  0.0-10.0 sec  4.91 GBytes  4.22 Gbits/sec
[ 12]  0.0-10.0 sec  2.11 GBytes  1.81 Gbits/sec
[  4]  0.0-10.0 sec  1.02 GBytes   874 Mbits/sec
[ 10]  0.0-10.0 sec   920 MBytes   770 Mbits/sec
[ 11]  0.0-10.0 sec   976 MBytes   817 Mbits/sec
[ 13]  0.0-10.0 sec   953 MBytes   798 Mbits/sec

Pour des tests plus long que 10 secondes (par défaut), il y a l'option -t (time) côté client pour spécifier le temps de transmission en secondes.

Tests UDP

iperf permet également de faire des tests UDP, pour ça rien de plus simple avec l'option -u côté client et serveur.

Premier test

Côté serveur, on ajoute l'option -u

# iperf -s -u

------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------

Même chose côté client:

# iperf -c <IP serveur> -u
------------------------------------------------------------
Client connecting to 192.168.2.2, UDP port 5001
Sending 1470 byte datagrams, IPG target: 11215.21 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.1 port 59680 connected with 192.168.2.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 893 datagrams

En mode UDP il y a une limitation par défaut de 1 Mbit/sec visible sur ce test. Cette limitation de bande passante peut être modifiée avec l'option -b

Changement de port et multi streams

Par défaut le serveur et le client communiquent sur le port 5001, ce port peut être changé avec l'option -p. Cette option est à définir côté serveur et client.

On bind le serveur sur le port 1337, en UDP:

# iperf -s -u -p 1337

On lance le test en UDP côté client, sur le port 1337, avec 3 streams:

# iperf -c <IP serveur> -u -p 1337 -P 3

------------------------------------------------------------
Client connecting to 192.168.2.2, UDP port 1337
Sending 1470 byte datagrams, IPG target: 11215.21 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.1 port 47583 connected with 192.168.2.2 port 1337
[  4] local 192.168.2.1 port 59951 connected with 192.168.2.2 port 1337
[  5] local 192.168.2.1 port 37474 connected with 192.168.2.2 port 1337
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  5] Sent 893 datagrams
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 893 datagrams
[  4]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  4] Sent 893 datagrams
[SUM]  0.0-10.0 sec  3.76 MBytes  3.15 Mbits/sec
[SUM] Sent 2679 datagrams

Toutes les bonnes choses ont une fin

content_post_image
Photo par Hello I'm Nik / Unsplash

Comme on l'a vu, iperf est un outil simple à utiliser et permet d'effectuer beaucoup de tests sur le réseau entre deux machines. Il y a d'autres, comme le changement de taille de paquet, le format des logs, le bind sur une autre IP, l'IPv6 etc... tout est bien sur détaillé dans le man iperf ou avec iperf --help. Pour aller plus loin, on peut également simuler de la congestion réseau ou du paquet loss avec des règles tc pendant les tests.