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
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.