12 septembre 2022

Automatisez les tests de réseau avec cet outil Linux open source

Utilisez iperf3 pour résoudre les problÚmes de bande passante, de synchronisation, de protocole et d'autres problÚmes sur votre réseau TCP/IP.

hyperf 3

La mise en réseau TCP / IP est un sujet complexe et cela devient vraiment compliqué lorsque vous essayez de définir des problÚmes de performances ou de résoudre un problÚme. Il est utile d'avoir des outils qui peuvent sonder votre systÚme et confirmer vos soupçons ou, mieux encore, qu'il n'y a pas de problÚmes.

Un de ces outils est open source hyperf3. Voici sa description de GitHub :

iperf est un outil de mesure active de la bande passante maximale joignable sur les réseaux IP. Il prend en charge l'optimisation de divers paramÚtres liés aux temps, aux protocoles et aux tampons. Chaque test rapporte le débit/débit binaire mesuré, la perte et d'autres paramÚtres.

Cet article vous montre comment:

  • EnquĂȘter sur les problĂšmes de bande passante entre deux terminaux avec iperf 3
  • Tester la connectivitĂ© multidiffusion UDP (User Datagram Protocol) (utilisĂ©e par Precision Time Protocol et d'autres protocoles pour la synchronisation de l'heure)
  • DĂ©couvrez les erreurs de contrĂŽle de redondance cyclique (CRC) sur une interface rĂ©seau
  • Utilisez ethtool et tcpdump pour confirmer qu'une interface rĂ©seau ou un cĂąble dĂ©fectueux interrompt le trafic
  • Écrire des scripts plus complexes Ă  l'aide de Python 3

J'expliquerai Ă©galement briĂšvement l'affinitĂ© CPU et pourquoi cela pourrait ĂȘtre important pour iperf3.

Commencer avec iperf3

Pour suivre ce tutoriel, vous aurez besoin de :

  • Une distribution Linux (j'ai exĂ©cutĂ© mes exemples sur un serveur Fedora)
  • La possibilitĂ© d'exĂ©cuter des commandes en tant que root (en utilisant sudo , par exemple)
  • Une comprĂ©hension de base des principes de rĂ©seau

ExĂ©cutez la commande pour installer iperf3. À propos de Fedora :

$ sudo dnf install -y iperf3

Iperf3 fonctionne en exĂ©cutant un client et un serveur qui se parlent. Voici quelques termes Ă  connaĂźtre avant de commencer Ă  l'utiliser :

  • Le dĂ©bit  mesure combien de colis arrivent Ă  destination avec succĂšs.
  • La bande passante  Le rĂ©seau est la capacitĂ© maximale de transfert de donnĂ©es d'un rĂ©seau.
  • La gigue  est le dĂ©lai entre le moment oĂč un signal est Ă©mis et celui oĂč il est reçu. Les bonnes connexions ont un temps de rĂ©ponse constant.
  • TCP  va Transmission Control Protocol . Il s'agit d'un protocole fiable qui garantit que les paquets arrivent dans le mĂȘme ordre qu'ils ont Ă©tĂ© envoyĂ©s via un tenir incontrĂŽlable.
  • UDP  il n'a pas de protocole de prise de contact comme TCP. Il est plus rapide que TCP, mais si un paquet est perdu, il ne sera pas renvoyĂ© et il n'y a aucune garantie que les paquets arriveront dans l'ordre envoyĂ©.

hyperf3

Dans la démonstration de cet article :

  • Le client et le serveur se connectent Ă  l'interface Ethernet filaire. (Je n'utiliserai pas d'interfaces sans fil car elles sont plus sujettes Ă  la gigue du bruit extĂ©rieur.)
  • Mon test utilise les paramĂštres par dĂ©faut (port, connexion TCP Ă  moins qu'ils ne soient remplacĂ©s par le drapeau --udpsur le client).

La preuve confirme si :

  • Le switch entre les deux machines supporte des connexions Ă  1.000 Mbit/sec et les interfaces ont Ă©tĂ© configurĂ©es Ă  cette capacitĂ©.
  • Le mode full-duplex est activĂ© pour envoyer et recevoir des donnĂ©es sur la carte en mĂȘme temps. Vous le confirmerez plus tard dans l'article avec un autre outil appelĂ© ethtool.

Sans plus tarder, je vais commencer.

Mesurer la bande passante et la gigue

Voici les commandes initiales sur le serveur :

[server ~]$ sudo ethtool eth0|rg -e 'Speed|Duplex'
 Speed: 1000Mb/s
 Duplex: Full

[server ~]$ ip --oneline address|rg 192
2: eth0    inet 192.168.1.11/24 brd 192.168.1.255 scope global dynamic eth0\       valid_lft 2090sec preferred_lft 2090sec

[server ~]$ iperf3 --server --bind 192.168.1.11 -affinity 1
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

Et maintenant le client :

[client ~]$ sudo ethtool eno1|rg -e 'Speed|Duplex'
 Speed: 1000Mb/s
 Duplex: Full

[client ~]$ iperf3 --client raspberrypi --bind 192.168.1.28 --affinity 1
Connecting to host raspberrypi, port 5201
[  5] local 192.168.1.28 port 47609 connected to 192.168.1.11 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   111 MBytes   932 Mbits/sec    0   2.79 MBytes       
[  5]   1.00-2.00   sec   110 MBytes   923 Mbits/sec    0   2.98 MBytes       
...     
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1021 MBytes   857 Mbits/sec    0             sender
[  5]   0.00-9.95   sec  1020 MBytes   860 Mbits/sec                  receiver

iperf Done.

J'analyse les résultats :

  • ZĂ©ro tentative (colonne Retr). C'est bien et attendu.
  • Le dĂ©bit est d'environ 860 Mbit/sec. La vitesse de liaison est proche de la bande passante thĂ©orique. Les commutateurs ont une limite sur la quantitĂ© de trafic que le fond de panier peut gĂ©rer.
  • TCP garantit les pertes de transmission de paquets, donc la gigue n'est pas signalĂ©e ici.

Si vous inversez le test (le client est maintenant le serveur), vous devriez voir des résultats similaires.

Tester la bande passante UDP

Pour tester UDP, procĂ©dez comme suit sur le client uniquement :

[client ~]$ iperf3 --client raspberrypi --bind 192.168.1.28 --udp --affinity 1
Connecting to host raspberrypi, port 5201
[  5] local 192.168.1.28 port 47985 connected to 192.168.1.11 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec   129 KBytes  1.05 Mbits/sec  91  
[  5]   1.00-2.00   sec   127 KBytes  1.04 Mbits/sec  90  
[  5]   2.00-3.00   sec   129 KBytes  1.05 Mbits/sec  91  
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec  1.25 MBytes  1.05 Mbits/sec  0.000 ms  0/906 (0%)  sender
[  5]   0.00-9.99   sec  1.25 MBytes  1.05 Mbits/sec  0.028 ms  0/906 (0%)  receiver

Voici les résultats:

  • Le dĂ©bit est beaucoup plus proche de la bande passante thĂ©orique. De plus, il n'y a pas de perte de paquets, ce qui est gĂ©nial.
  • UDP ne garantit pas la perte de paquets, donc les datagrammes perdus et la gigue sont signalĂ©s (et ont de bonnes valeurs).

Vous vous demandez peut-ĂȘtre ce que c'est --affinitydrapeau. Il n'est pas vraiment nĂ©cessaire ici de tester la bande passante sur cet exemple simple, mais cela me donne une excuse pour parler d'affinitĂ©.

DĂ©viation rapide : affinitĂ© CPU, NUMA, isolcpus

Si vous Ă©tiez curieux et que vous avez consultĂ© la documentation et les exemples d'iperf, vous avez probablement vu des rĂ©fĂ©rences Ă  l'affinitĂ© du CPU ou du processeur .

Alors c'est quoi? De WikipĂ©dia :

L'affinitĂ© du processeur, ou le verrouillage du processeur ou "l'affinitĂ© du cache", permet Ă  un processus ou Ă  un thread d'ĂȘtre associĂ© et dissociĂ© d'une unitĂ© centrale de traitement (CPU) ou d'une gamme de processeurs, de sorte que le processus ou le thread ne s'exĂ©cute que sur le processeur ou le processeur dĂ©signĂ© Ă  la place de n'importe quel processeur.

Pourquoi voudriez-vous ajouter un processus Ă  un groupe CPU spĂ©cifique ?

Aucune instance verrouillée par CPU ne peut utiliser les CPU d'une autre instance gelée, ce qui évite les conflits de ressources entre les instances. L'accÚs à la mémoire non uniforme (NUMA) permet à plusieurs processeurs de partager les caches L1, L2 et L3 et la mémoire principale.

Vous pouvez utiliser le matériel NUMA pour vous assurer de toujours utiliser la mémoire la plus proche du processeur.

À quoi ressemble un serveur avec plusieurs nƓuds NUMA ? Vous pouvez le dĂ©couvrir avec lscpu| rg NUMA:

[client ~]$ lscpu|rg NUMA
NUMA node(s):                    2
NUMA node0 CPU(s):               0-7
NUMA node1 CPU(s):               8-15

Il s'agit d'un serveur 16 CPU avec deux nƓuds NUMA (il s'agit d'un exemple simplifiĂ©, une machine avec HyperThreading activĂ© semble diffĂ©rente. Selon l'application, vous pouvez dĂ©cider de le dĂ©sactiver.

N'oubliez pas que vous pouvez utiliser l'affinitĂ© CPU non seulement pour augmenter les performances du rĂ©seau mais aussi les performances du disque.

Pour en revenir Ă  iperf3, vous pouvez l'ajouter Ă  un processeur spĂ©cifique en utilisant -A--affinity. Par exemple, le CPU 3 (numĂ©rotĂ© de 0 Ă  n-1) ressemble Ă  ceci :

# Equivalent of running iperf3 with numactl: /bin/numactl --physcpubind=2 iperf3 -c remotehost
iperf3 --affinity 2 --client remotehost

N'oubliez pas que vous devrez peut-ĂȘtre Ă©galement dire au systĂšme d'exploitation d'Ă©viter d'exĂ©cuter des processus hĂŽtes sur ces processeurs, donc si vous utilisez Grubby, vous pouvez le faire avec isolcpus :

# Find the default kernel
$ sudo grubby --default-kernel

# Use that information and add isolcpus parameter, then reboot
$ sudo grubby --update-kernel=/boot/vmlinuz-5.14.18-100.fc33.x86_64 --args="isolcpus=2"
sudo shutdown -r now 'Updated kernel isolcpus, need to reboot'

Encore une fois, cela n'est pas nécessaire pour résoudre un problÚme de réseau, mais cela peut s'avérer utile si vous souhaitez que iperf3 se comporte comme l'une de vos applications optimisées.

L'optimisation est une sujet complexe, puis prenez une tasse de cafĂ© (ou deux) et prĂ©parez-vous Ă  commencer Ă  lire.

Utilisez iperf3 pour détecter les paquets perdus et les erreurs CRC

Un Erreur CRC elle est causĂ©e par un pĂ©riphĂ©rique physique dĂ©fectueux (carte rĂ©seau, port de commutateur, cĂąble) ou par une inadĂ©quation des configurations full et half duplex entre deux pĂ©riphĂ©riques. Celles-ci sont parfois difficiles Ă  suivre sur les commutateurs en mode direct, oĂč le commutateur transmet les erreurs reçues Ă  tous les ports.

Il s'agit d'un scénario simplifié pour s'assurer qu'une nouvelle connexion NIC fonctionne sans erreurs CRC ou reçues/transmises (Rx/Tx) (ce qui signifie que la carte de commutation, le cùble et le port sont OK).

Dans cet esprit, vous pouvez effectuer un test simple pour vous assurer que l'Ă©tat du lien est bon :

  • Capturez l'Ă©tat CRC et les erreurs de perte de paquets sur la carte rĂ©seau testĂ©e.
  • ExĂ©cutez iperf3 en mode TCP plus longtemps que d'habitude.
  • RĂ©cupĂšre les statistiques CRC de la carte rĂ©seau.

Si la différence est supérieure à zéro, alors :

  1. Vérifiez le mode duplex intégral sur la carte et le port du commutateur (ethtool).
  2. Remplacez le cĂąble.
  3. Réinstallez ou remplacez la carte réseau.
  4. Changez le port sur le commutateur.

Obtenez l'image ; iperf3 aidera Ă  "brĂ»ler" le lien et Ă  dĂ©clencher tout comportement indĂ©sirable avant d'utiliser cette interface en production.

Voici le processus en action. Supposons que nous prenions le premier instantanĂ© sur le serveur iperf3 :

[server ~]$ sudo ethtool --statistics  eth0| rg -i -e 'dropped|error'
     rx_errors: 0
     tx_errors: 0
     rx_dropped: 0
     tx_dropped: 0
     rxq0_errors: 0
     rxq0_dropped: 0
     rxq1_errors: 0
     rxq1_dropped: 0
     rxq2_errors: 0
     rxq2_dropped: 0
     rxq3_errors: 0
     rxq3_dropped: 0
     rxq16_errors: 0
     rxq16_dropped: 0

Alors le client :

[client ~]$ sudo ethtool --statistics  eno1| rg -i -e 'dropped|errors'
     tx_errors: 0
     rx_errors: 0
     align_errors: 0

ExĂ©cutez le iperf3serveur:

[server ~]$ iperf3 --server --bind 192.168.1.11
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

Cours iperf3sur le client pendant 120 secondes :

[client ~]$ iperf3 --client raspberrypi --bind 192.168.1.28 --time 120 
Connecting to host raspberrypi, port 5201
[  5] local 192.168.1.28 port 41337 connected to 192.168.1.11 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   111 MBytes   934 Mbits/sec    0   2.94 MBytes       
[  5]   1.00-2.00   sec   111 MBytes   933 Mbits/sec    0   2.95 MBytes       
[  5]   2.00-3.00   sec   111 MBytes   933 Mbits/sec    0   2.95 MBytes       
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-120.00 sec  11.0 GBytes   787 Mbits/sec    0             sender
[  5]   0.00-119.70 sec  11.0 GBytes   789 Mbits/sec                  receiver

# Measure again ...
[client ~]$ sudo ethtool --statistics  eno1| rg -i -e 'dropped|errors'
     tx_errors: 0
     rx_errors: 0
     align_errors: 0

Je vais maintenant parler d'un autre outil utile pour obtenir des statistiques d'interface réseau, ethtool.

Qu'est-ce qu'ethtool ?

Comment expliquez-vous Wikipédia :

ethtool est le principal moyen des systÚmes d'exploitation basés sur le noyau Linux (principalement Linux et Android) pour afficher et modifier les paramÚtres des contrÎleurs d'interface réseau (NIC) et du logiciel de pilote de périphérique associé à partir des programmes d'application dans en cours d'exécution dans l'espace utilisateur.

Voici quelques questions pour vous aprĂšs avoir vĂ©rifiĂ© la page homme par ethtool :

  1. Que fait le sudo ethtool -g eno1commande?
  2. Et ça?sudo ethtool -s eno1 speed 1000 duplex full autoneg on

L'utilitaire ethtool est un autre outil que vous devriez avoir dans votre boĂźte Ă  outils.

Automatiser iperf3 avec Python 3

Vous remarquerez peut-ĂȘtre qu'iperf3 possĂšde une bibliothĂšque qui vous permet d'intĂ©grer l'outil Ă  d'autres langages, dont Python :

[client ~]$ rpm -qil iperf3|rg libiperf
/usr/lib64/libiperf.so.0
/usr/lib64/libiperf.so.0.0.0
/usr/share/man/man3/libiperf.3.gz

Il existe plusieurs raccourcis pour Python :

  • hyperf3-python a une API pour intĂ©grer iperf3 Ă  Python, en utilisant ces liaisons.
  • Il Module Python ethtool  il est disponible mais marquĂ© obsolĂšte, mais je l'utiliserai pour les besoins de cette dĂ©monstration.

Je ne couvrirai pas l'API ici, mais vous dirigerai plutĂŽt vers le code source d'un script Python qui utilise iperf3 et ethtool pour dĂ©tecter les erreurs de rĂ©seau (comme je l'ai fait manuellement ci-dessus). Vous pouvez le voir fonctionner ci-dessous. VĂ©rifier la dĂ©pĂŽt et exĂ©cutez le script. Vous serez Ă©tonnĂ© de voir Ă  quel point il est facile d'automatiser certaines tĂąches avec Python.

Que pouvez-vous faire ensuite ?

L'apprentissage ne s'arrĂȘte jamais, alors voici quelques conseils et observations pour vous aider Ă  continuer :

  • DonnĂ©es plus rapides a plusieurs exemples d'utilisation d'iperf avec diffĂ©rents paramĂštres.
  • Veuillez noter qu'isolcpus est considĂ©rĂ© comme obsolĂšte et processeur conseillĂ©. RĂ©fĂ©rez-vous Ă  ceci discussion sur le dĂ©bordement de la pile pour voir comment jouer avec cpuset.
  • Vous savez maintenant comment Ă©crire vos propres scripts de dĂ©pannage avec l'API Python iperf3. Vous devriez probablement Ă©crire un serveur iperf3 qui peut afficher les rĂ©sultats Ă  l'aide d'un navigateur Web (peut-ĂȘtre le combiner avec API rapide ?).

 

Informations sur l'auteur

Vous avez des doutes ? Vous ne savez pas par oĂč commencer ? Contactez-nous !

Nous avons toutes les réponses à vos questions pour vous aider à faire le bon choix.

Discute avec nous

Discutez directement avec notre support avant-vente.

0256569681

Contactez-nous par téléphone pendant les heures de bureau 9h30 - 19h30

Contactez-nous en ligne

Ouvrez une demande directement dans l'espace contact.

INFORMATIONS

Managed Server Srl est un acteur italien leader dans la fourniture de solutions systÚme GNU/Linux avancées orientées vers la haute performance. Avec un modÚle d'abonnement peu coûteux et prévisible, nous garantissons que nos clients ont accÚs à des technologies avancées en matiÚre d'hébergement, de serveurs dédiés et de services cloud. En plus de cela, nous proposons des conseils systÚme sur les systÚmes Linux et une maintenance spécialisée en SGBD, sécurité informatique, Cloud et bien plus encore. Nous nous distinguons par notre expertise dans l'hébergement de CMS Open Source de premier plan tels que WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart et Magento, soutenus par un service d'assistance et de conseil de haut niveau adapté aux administrations publiques, aux PME et à toutes tailles.

Red Hat, Inc. dĂ©tient les droits de Red HatÂź, RHELÂź, RedHat LinuxÂź et CentOSÂź ; AlmaLinuxℱ est une marque commerciale d'AlmaLinux OS Foundation ; Rocky LinuxÂź est une marque dĂ©posĂ©e de la Rocky Linux Foundation ; SUSEÂź est une marque dĂ©posĂ©e de SUSE LLC ; Canonical Ltd. dĂ©tient les droits sur UbuntuÂź ; Software in the Public Interest, Inc. dĂ©tient les droits sur DebianÂź ; Linus Torvalds dĂ©tient les droits sur LinuxÂź ; FreeBSDÂź est une marque dĂ©posĂ©e de la FreeBSD Foundation ; NetBSDÂź est une marque dĂ©posĂ©e de la Fondation NetBSD ; OpenBSDÂź est une marque dĂ©posĂ©e de Theo de Raadt. Oracle Corporation dĂ©tient les droits sur OracleÂź, MySQLÂź et MyRocksÂź ; PerconaÂź est une marque dĂ©posĂ©e de Percona LLC ; MariaDBÂź est une marque dĂ©posĂ©e de MariaDB Corporation Ab ; REDISÂź est une marque dĂ©posĂ©e de Redis Labs Ltd. F5 Networks, Inc. dĂ©tient les droits sur NGINXÂź et NGINX PlusÂź ; VarnishÂź est une marque dĂ©posĂ©e de Varnish Software AB. Adobe Inc. dĂ©tient les droits sur MagentoÂź ; PrestaShopÂź est une marque dĂ©posĂ©e de PrestaShop SA ; OpenCartÂź est une marque dĂ©posĂ©e d'OpenCart Limited. Automattic Inc. dĂ©tient les droits sur WordPressÂź, WooCommerceÂź et JetPackÂź ; Open Source Matters, Inc. dĂ©tient les droits sur JoomlaÂź ; Dries Buytaert dĂ©tient les droits sur DrupalÂź. Amazon Web Services, Inc. dĂ©tient les droits sur AWSÂź ; Google LLC dĂ©tient les droits sur Google Cloudℱ et Chromeℱ ; Facebook, Inc. dĂ©tient les droits sur FacebookÂź ; Microsoft Corporation dĂ©tient les droits sur MicrosoftÂź, AzureÂź et Internet ExplorerÂź ; La Fondation Mozilla dĂ©tient les droits sur FirefoxÂź. ApacheÂź est une marque dĂ©posĂ©e de The Apache Software Foundation ; PHPÂź est une marque dĂ©posĂ©e du groupe PHP. CloudFlareÂź est une marque dĂ©posĂ©e de Cloudflare, Inc. ; NETSCOUTÂź est une marque dĂ©posĂ©e de NETSCOUT Systems Inc. ; ElasticSearchÂź, LogStashÂź et KibanaÂź sont des marques dĂ©posĂ©es d'Elastic NV. Ce site n'est affiliĂ©, sponsorisĂ© ou autrement associĂ© Ă  aucune des entitĂ©s mentionnĂ©es ci-dessus et ne reprĂ©sente aucune de ces entitĂ©s de quelque maniĂšre que ce soit. Tous les droits sur les marques et noms de produits mentionnĂ©s sont la propriĂ©tĂ© de leurs titulaires respectifs des droits d'auteur. Toutes les autres marques mentionnĂ©es appartiennent Ă  leurs titulaires. MANAGED SERVERÂź est une marque dĂ©posĂ©e au niveau europĂ©en par MANAGED SERVER SRL Via Enzo Ferrari, 9 62012 Civitanova Marche (MC) Italie.

Retour en haut de page