Rechercher

31.2. Réglage de l'équilibrage des IRQ

download PDF

Sur les hôtes multicœurs, vous pouvez augmenter les performances en vous assurant que Red Hat Enterprise Linux équilibre les files d'attente d'interruption (IRQ) afin de distribuer les interruptions entre les cœurs du CPU.

31.2.1. Interruptions et gestionnaires d'interruptions

Lorsqu'un contrôleur d'interface réseau (NIC) reçoit des données, il les copie dans les tampons du noyau en utilisant l'accès direct à la mémoire (DMA). La carte d'interface réseau informe ensuite le noyau de ces données en déclenchant une interruption matérielle. Ces interruptions sont traitées par des gestionnaires d'interruption qui effectuent un travail minimal, car ils ont déjà interrompu une autre tâche et les gestionnaires ne peuvent pas s'interrompre eux-mêmes. Les interruptions matérielles peuvent être coûteuses en termes d'utilisation du processeur, en particulier si elles utilisent des verrous du noyau.

Le gestionnaire d'interruptions matérielles laisse alors la majorité de la réception des paquets à un processus de demande d'interruption logicielle (SoftIRQ). Le noyau peut programmer ces processus de manière plus équitable.

Exemple 31.1. Affichage des interruptions matérielles

Le noyau stocke les compteurs d'interruptions dans le fichier /proc/interrupts. Pour afficher les compteurs d'un NIC spécifique, tel que enp1s0, entrez :

# egrep "CPU|enp1s0" /proc/interrupts
         CPU0     CPU1     CPU2    CPU3    CPU4   CPU5
 105:  141606        0        0       0       0      0  IR-PCI-MSI-edge      enp1s0-rx-0
 106:       0   141091        0       0       0      0  IR-PCI-MSI-edge      enp1s0-rx-1
 107:       2        0   163785       0       0      0  IR-PCI-MSI-edge      enp1s0-rx-2
 108:       3        0        0  194370       0      0  IR-PCI-MSI-edge      enp1s0-rx-3
 109:       0        0        0       0       0      0  IR-PCI-MSI-edge      enp1s0-tx

Un vecteur d'interruption est attribué à chaque file d'attente dans la première colonne. Le noyau initialise ces vecteurs lorsque le système démarre ou lorsqu'un utilisateur charge le module du pilote NIC. Chaque file d'attente de réception (RX) et de transmission (TX) se voit attribuer un vecteur unique qui indique au gestionnaire d'interruption de quelle carte ou file d'attente l'interruption provient. Les colonnes représentent le nombre d'interruptions entrantes pour chaque cœur de CPU.

31.2.2. Demandes d'interruption logicielle

Les demandes d'interruption logicielle (SoftIRQ) effacent les tampons de l'anneau de réception des adaptateurs réseau. Le noyau planifie l'exécution des routines SoftIRQ à un moment où les autres tâches ne seront pas interrompues. Sur Red Hat Enterprise Linux, les processus nommés ksoftirqd/cpu-number exécutent ces routines et appellent des fonctions de code spécifiques au pilote.

Pour surveiller les compteurs SoftIRQ pour chaque cœur de CPU, entrez :

# watch -n1 'egrep "CPU|NET_RX|NET_TX" /proc/softirqs'
                    CPU0       CPU1	  CPU2       CPU3	CPU4	   CPU5       CPU6	 CPU7
      NET_TX:	   49672      52610	 28175      97288      12633	  19843      18746     220689
      NET_RX:         96       1615        789         46         31	   1735       1315     470798

La commande met à jour dynamiquement la sortie. Appuyer sur Ctrl+C pour interrompre la sortie.

31.2.3. NAPI Polling

La nouvelle API (NAPI) est une extension du cadre de traitement des paquets du pilote de périphérique visant à améliorer l'efficacité des paquets réseau entrants. Les interruptions matérielles sont coûteuses car elles entraînent généralement un changement de contexte de l'espace du noyau à l'espace utilisateur et vice-versa, et ne peuvent pas s'interrompre elles-mêmes. Même avec la coalescence des interruptions, le gestionnaire d'interruptions monopolise complètement un cœur de processeur. Avec la NAPI, le pilote peut utiliser un mode d'interrogation au lieu d'être interrompu par le noyau pour chaque paquet reçu.

En fonctionnement normal, le noyau émet une première interruption dure, suivie d'un gestionnaire de demande d'interruption douce (SoftIRQ) qui interroge la carte réseau à l'aide de routines NAPI. Pour éviter que les SoftIRQ ne monopolisent un cœur de processeur, la routine d'interrogation dispose d'un budget qui détermine le temps de processeur que la SoftIRQ peut consommer. Une fois la routine d'interrogation SoftIRQ terminée, le noyau quitte la routine et la programme pour qu'elle s'exécute à nouveau ultérieurement afin de répéter le processus de réception des paquets de la carte réseau.

31.2.4. Le service irqbalance

Sur les systèmes avec ou sans architecture NUMA (Non-Uniform Memory Access), le service irqbalance équilibre efficacement les interruptions entre les cœurs de l'unité centrale, en fonction des conditions du système. Le service irqbalance s'exécute en arrière-plan et surveille la charge du processeur toutes les 10 secondes. Il déplace les interruptions vers d'autres cœurs de processeur lorsque la charge d'un processeur est trop élevée. En conséquence, le système fonctionne bien et gère la charge plus efficacement.

Si irqbalance n'est pas en cours d'exécution, c'est généralement le noyau 0 de l'unité centrale qui gère la plupart des interruptions. Même en cas de charge modérée, ce cœur d'unité centrale peut devenir très occupé en essayant de gérer la charge de travail de tout le matériel du système. Par conséquent, les interruptions ou les travaux basés sur les interruptions peuvent être manqués ou retardés. Cela peut entraîner une baisse des performances du réseau et du stockage, une perte de paquets et, éventuellement, d'autres problèmes.

Important

La désactivation de irqbalance peut avoir un impact négatif sur le débit du réseau.

Sur les systèmes dotés d'un seul cœur de processeur, le service irqbalance n'apporte aucun avantage et s'arrête de lui-même.

Par défaut, le service irqbalance est activé et fonctionne sous Red Hat Enterprise Linux. Pour réactiver le service si vous l'avez désactivé, entrez :

# systemctl enable --now irqbalance

31.2.5. Augmentation de la durée d'exécution des SoftIRQ sur l'unité centrale

Si les SoftIRQ ne durent pas assez longtemps, le taux de données entrantes peut dépasser la capacité du noyau à vider la mémoire tampon assez rapidement. Par conséquent, les tampons du contrôleur d'interface réseau (NIC) débordent et des paquets sont perdus.

Si les processus softirqd n'ont pas pu récupérer tous les paquets des interfaces en un cycle d'interrogation de l'interface NAPI, cela indique que les SoftIRQ n'ont pas assez de temps CPU. Cela peut être le cas sur des hôtes avec des cartes d'interface réseau rapides, telles que 10 Gbps ou plus. Si vous augmentez les valeurs des paramètres du noyau net.core.netdev_budget et net.core.netdev_budget_usecs, vous pouvez contrôler le temps et le nombre de paquets que softirqd peut traiter dans un cycle d'interrogation.

Procédure

  1. Pour déterminer s'il est nécessaire d'ajuster le paramètre net.core.netdev_budget, affichez les compteurs du fichier /proc/net/softnet_stat:

    # awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t
    221951548  0  0      0  0  0  0  0  0  0  0  0  0
    192058677  0  20380  0  0  0  0  0  0  0  0  0  1
    455324886  0  0      0  0  0  0  0  0  0  0  0  2
    ...

    La commande awk convertit les valeurs de /proc/net/softnet_stat du format hexadécimal au format décimal et les affiche sous forme de tableau. Chaque ligne représente un cœur de CPU en commençant par le cœur 0.

    Les colonnes concernées sont les suivantes :

    • Première colonne : Nombre total de trames reçues.
    • Troisième colonne : Nombre de fois où les processus softirqd n'ont pas pu récupérer tous les paquets des interfaces au cours d'un cycle d'interrogation de la NAPI.
    • Dernière colonne : Le numéro du cœur de l'unité centrale.
  2. Si les compteurs de la troisième colonne du fichier /proc/net/softnet_stat augmentent avec le temps, réglez le système :

    1. Affiche les valeurs actuelles des paramètres net.core.netdev_budget_usecs et net.core.netdev_budget:

      # sysctl net.core.netdev_budget_usecs net.core.netdev_budget
      net.core.netdev_budget_usecs = 2000
      net.core.netdev_budget = 300

      Avec ces paramètres, les processus softirqd ont jusqu'à 2000 microsecondes pour traiter jusqu'à 300 messages du NIC dans un cycle d'interrogation. L'interrogation se termine en fonction de la condition qui est remplie en premier.

    2. Créez le fichier /etc/sysctl.d/10-netdev_budget.conf avec le contenu suivant :

      net.core.netdev_budget = 600
      net.core.netdev_budget_usecs = 4000

      Fixe les paramètres à un double de leurs valeurs actuelles.

    3. Charger les paramètres du fichier /etc/sysctl.d/10-netdev_budget.conf:

      # sysctl -p /etc/sysctl.d/10-netdev_budget.conf

Vérification

  • Contrôler la troisième colonne du fichier /proc/net/softnet_stat:

    # awk '{for (i=1; i<=NF; i ) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t

    Si les valeurs continuent d'augmenter, réglez net.core.netdev_budget_usecs et net.core.netdev_budget à des valeurs plus élevées. Répétez ce processus jusqu'à ce que les compteurs n'augmentent plus.

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.