GNU/Linux >> Tutoriels Linux >  >> Linux

Introduction aux interruptions Linux et à l'affinité CPU SMP

Les interruptions sont des signaux envoyés via IRQ (Interrupt Request Line) par un matériel ou un logiciel.

Les interruptions permettent aux périphériques tels que le clavier, les cartes série et les ports parallèles d'indiquer qu'ils nécessitent l'attention du processeur.

Une fois que le CPU reçoit la demande d'interruption, le CPU arrête temporairement l'exécution du programme en cours d'exécution et invoque un programme spécial appelé gestionnaire d'interruption ou ISR (routine de service d'interruption).

Le service d'interruption ou la routine de gestionnaire d'interruption peut être trouvé dans la table des vecteurs d'interruption qui se trouve à une adresse fixe dans la mémoire. Une fois l'interruption traitée, le CPU reprend le programme interrompu.

Au démarrage, le système identifie tous les périphériques et les gestionnaires d'interruptions appropriés sont chargés dans la table d'interruptions.

Voici deux façons de demander l'attention du processeur :

  1. Basé sur les interruptions
  2. Basé sur les sondages

Tous les systèmes d'exploitation basés sur Linux sont pilotés par interruption.

Lorsque nous appuyons sur une touche du clavier, le clavier indique au processeur qu'une touche a été enfoncée. Mais le processeur peut être occupé à traiter certaines choses de la RAM, de l'horloge système, de la carte NIC, peut-être de la vidéo ou du bus PCI. Dans ce cas, le clavier place une tension sur la ligne IRQ affectée à ce matériel, ici dans ce cas [Clavier]. Ce changement de tension sert de demande de l'appareil indiquant que l'appareil a une demande qui doit être traitée.

/proc/fichier d'interruptions

Sur une machine Linux, le fichier /proc/interrupts contient des informations sur les interruptions utilisées et le nombre de fois que le processeur a été interrompu

# cat /proc/interrupts
           CPU0   CPU1  CPU2  CPU3
  0: 3710374484      0     0     0  IO-APIC-edge  timer
  1:         20      0     0     0  IO-APIC-edge  i8042
  6:          5      0     0     0  IO-APIC-edge  floppy
  7:          0      0     0     0  IO-APIC-edge  parport0
  8:          0      0     0     0  IO-APIC-edge  rtc
  9:          0      0     0     0  IO-APIC-level  acpi
 12:        240      0     0     0  IO-APIC-edge  i8042
 14:   11200026      0     0     0  IO-APIC-edge  ide0
 51:   61281329      0     0     0  IO-APIC-level  ioc0
 59:          1      0     0     0  IO-APIC-level  vmci
 67:   19386473      0     0     0  IO-APIC-level  eth0
 75:   94595340      0     0     0  IO-APIC-level  eth1
NMI:          0      0     0     0
LOC: 3737150067 3737142382 3737145101 3737144204
ERR:          0
MIS:          0

Dans le fichier ci-dessus :

  • La première colonne est le numéro IRQ.
  • La deuxième colonne indique combien de fois le cœur du processeur a été interrompu. Dans l'exemple ci-dessus, la minuterie est le nom de l'interruption [horloge système] et 3710374484 est le nombre de fois que CPU0 a été interrompu. I8042 est un contrôleur de clavier qui contrôle les claviers et la souris PS/2 dans les PC.
  • Pour une interruption comme rtc [Real time clock], le CPU n'a pas été interrompu. Les RTC sont présents dans les appareils électroniques pour garder une trace du temps.
  • NMI et LOC sont des pilotes utilisés sur le système qui ne sont pas accessibles/configurés par l'utilisateur.

Le numéro IRQ détermine la priorité de l'interruption qui doit être gérée par le CPU.

Une petite valeur de numéro IRQ signifie une priorité plus élevée.

Par exemple, si le CPU reçoit simultanément une interruption du clavier et de l'horloge système. Le processeur servira d'abord l'horloge système car il a le numéro IRQ 0.

  • IRQ 0 :minuteur système (ne peut pas être modifié) ;
  • IRQ 1 :contrôleur de clavier (ne peut pas être modifié)
  • IRQ 3 :contrôleur de port série pour le port série 2 (partagé avec le port série 4, le cas échéant) ;
  • IRQ 4 :contrôleur de port série pour le port série 1 (partagé avec le port série 3, le cas échéant) ;
  • IRQ 5 :ports parallèles 2 et 3 ou carte son ;
  • IRQ 6 :contrôleur de disquette ;
  • IRQ 7 — port parallèle 1. Il est utilisé pour les imprimantes ou pour tout port parallèle si une imprimante n'est pas présente.

Pour les appareils tels que le joystick, le processeur n'attend pas que l'appareil envoie une interruption. Étant donné que le joystick est utilisé pour les jeux et que le mouvement du joystick sera rapide, il sera idéal d'utiliser l'interrogation et de vérifier si l'appareil a besoin d'attention. L'inconvénient de cette méthode est que le processeur peut entrer en attente occupée, vérifiant l'appareil plusieurs fois.

Dans le même ordre d'idées, il est également essentiel de gérer correctement les signaux sous Linux.

Interruptions matérielles

Tous les scénarios discutés ci-dessus sont des exemples d'interruptions matérielles.

Les interruptions matérielles sont en outre classées en deux grandes catégories :

  1. Interruptions non masquables [NMI] :comme leur nom l'indique, ces types d'interruptions ne peuvent pas être ignorés ou supprimés par le CPU. Les MNI sont envoyés sur une ligne d'interruption séparée et sont généralement utilisés pour les erreurs matérielles critiques telles que les erreurs de mémoire, les interruptions matérielles indiquant une panne de ventilateur, une panne de capteur de température, etc.
  2. Interruptions masquables :ces interruptions peuvent être ignorées ou retardées par le processeur. Le registre de masque d'interruption masque les interruptions déclenchées sur les broches externes du contrôleur de cache. Mettre un bit en écrivant un 0, désactive le déclenchement de l'interruption sur la broche

Interruptions logicielles

Ces interruptions sont générées lorsque la CPU exécute une instruction qui peut provoquer une condition d'exception dans la CPU [unité ALU] elle-même.

Par exemple, diviser un nombre par zéro, ce qui n'est pas possible, cela conduira à une exception de division par zéro, obligeant l'ordinateur à abandonner le calcul ou à afficher un message d'erreur.

Le fichier /proc/stat fait également partie du système de fichiers /proc, qui contient des informations sur les statistiques du noyau du système, ainsi que des informations sur les interruptions.

# cat /proc/stat
cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

La ligne intr indique le nombre d'interruptions traitées depuis le démarrage. La première colonne est le total de toutes les interruptions traitées. Chaque colonne suivante est le total pour une interruption particulière.

SMP_AFFINITY

Le multitraitement symétrique est le traitement de programmes par plusieurs processeurs.

Le fichier smp_affinity contient la valeur d'affinité d'interruption pour un numéro IRQ. Le fichier smp_affinity associé à chaque numéro IRQ est stocké dans le fichier /proc/irq/IRQ_NUMBER/smp_affinity. La valeur dans le fichier est stockée dans un masque binaire hexadécimal représentant tous les cœurs de processeur du système. smp_affinity fonctionne pour les périphériques dotés de pilotes de périphériques compatibles IO-APIC.

Par exemple, l'entrée smp_affinity pour le pilote Ethernet est illustrée ci-dessous :

grep eth0 /proc/interrupts
67: 23834931 0 0 0 IO-APIC-level eth0

Le numéro IRQ pour eth0 est 67 et le fichier smp_affinity correspondant est situé à :

cat /proc/irq/67/smp_affinity
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

L'équivalent décimal de la valeur "000000001" est "1". c'est-à-dire que toutes les interruptions liées au pilote Ethernet seront traitées par CPU0.

Nous pouvons modifier manuellement l'affinité du processeur en modifiant les valeurs dans le fichier smp_affinity pour un contrôleur particulier ou en utilisant irqbalance.

Équilibre IRQ

Irqbalance est un utilitaire Linux qui distribue les interruptions sur les cœurs de processeur de votre système informatique, ce qui contribue à améliorer les performances.

L'objectif d'Irqbalance est de trouver un équilibre entre économie d'énergie et performances optimales.

Si irqbalance n'est pas installé sur votre système, installez-le en utilisant yum comme indiqué ci-dessous.

# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5

# yum search irqbalance

# yum install irqbalance.x86_64

Démarrez le service irqbalance :

service irqbalance start

Voici un exemple de sortie d'une machine Linux sur laquelle irqbalance est installé. Nous avons pu voir que les interruptions sont désormais réparties entre les processeurs.

# cat /proc/interrupts
           CPU0     CPU1      CPU2       CPU3
  0:  950901695        0         0          0  IO-APIC-edge  timer
  1:         13        0         0          0  IO-APIC-edge  i8042
  6:         96    10989       470          0  IO-APIC-edge  floppy
  7:          0        0         0          0  IO-APIC-edge  parport0
  8:          1        0         0          0  IO-APIC-edge  rtc
  9:          0        0         0          0  IO-APIC-level  acpi
 12:        109     1787         0          0  IO-APIC-edge  i8042
 15:         99 84813914         0          0  IO-APIC-edge  ide1
 51:      17371        0  46689970          0  IO-APIC-level  ioc0
 67:       1741        0         0  225409160  PCI-MSI  eth0
 83:          0        0         0          0  PCI-MSI  vmci
NMI:          0        0         0          0
LOC:  950902917  950903742  950901202  950901400
ERR:          0
MIS:          0

Irqbalance est particulièrement utile sur les systèmes dotés de processeurs multicœurs, car les interruptions ne seront généralement traitées que par le premier cœur.


Linux
  1. Introduction aux commandes Linux chgrp et newgrp

  2. Linux - Comment limiter un processus à un seul cœur de processeur sous Linux ??

  3. Récupérer l'utilisation du processeur et l'utilisation de la mémoire d'un seul processus sous Linux ?

  4. Comment une interruption est-elle gérée sous Linux ?

  5. Utilisation du processeur Linux et historique d'exécution des processus

Introduction au VPN et voici comment l'utiliser sous Linux

Optimisez automatiquement la vitesse et la puissance du processeur avec Auto-cpufreq sous Linux

CPU Power Manager - Contrôlez et gérez la fréquence du processeur sous Linux

Une introduction au hachage et aux sommes de contrôle sous Linux

3 astuces pour améliorer les performances des processus Linux avec priorité et affinité

Présentation de la surveillance et du réglage des performances Linux