Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.3. Réglages des interruptions et des IRQ

Une requête d'interruption (IRQ, de l'anglais « Interrupt Request ») est une requête de service envoyée au niveau du matériel. Les interruptions peuvent être envoyées par ligne de matériel dédiée ou à travers un bus de matériel en tant que paquet d'informations (MSI, de l'anglais « Message Signaled Interrupt »).
Lorsque les interruptions sont activées, la réception d'une IRQ invite un interrupteur à interrompre le contexte. Le code d'envoi des interruptions du noyau récupère le numéro de l'IRQ et sa liste associée d'ISR (de l'anglais, « Interrupt Service Routines ») enregistrés, puis appelle chaque ISR à son tour. L'ISR reconnaît l'interruption et ignore les interruptions redondantes de la même IRQ, puis met en file d'attente un gestionnaire différé pour terminer le traitement de l'interruption et faire en sorte que l'ISR n'ignore pas les futures interruptions.
Le fichier /proc/interrupts répertorie le nombre d'interruptions par CPU par périphérique d'E/S. Il affiche le numéro de l'IRQ, le numéro de cette interruption géré par chaque cœur de CPU, le type d'interruption et une liste séparée par des virgules des pilotes enregistrés pour recevoir cette interruption. (Pour obtenir des détailes supplémentaires, reportez-vous à la page man proc(5) : man 5 proc)
Les IRQ ont une propriété « d'affinité » associée, smp_affinity, qui définit les cœurs des CPU autorisés à exécuter l'ISR pour cette IRQ. Cette propriété peut être utilisée pour améliorer les performances de l'application en assignant l'affinité de l'interruption et celle du thread de l'application vers un ou plusieurs cœurs de CPU spécifiques. Ceci permet le partage de ligne de cache entre l'interruption spécifiée et les threads de l'application.
La valeur d'affinité de l'interruption avec un numéro d'IRQ en particulier est stockée dans le fichier /proc/irq/NUMÉRO_IRQ/smp_affinity, qui peut être affiché et modifié par l'utilisateur root. La valeur stockée dans ce fichier est un masque de bits représentant tous les cœurs des CPU dans le système.
Par exemple, pour définir l'affinité de l'interruption du pilote Ethernet sur un serveur avec quatre cœurs de CPU, commencez par déterminer le numéro de l'IRQ associé à ce pilote Ethernet :
# grep eth0 /proc/interrupts
32:   0     140      45       850264      PCI-MSI-edge      eth0
Utilisez le numéro de l'IRQ pour localiser le fichier smp_affinity approprié :
# cat /proc/irq/32/smp_affinity 
f
La valeur par défaut de smp_affinity est f, ce qui signifie que l'IRQ peut être servie sur n'importe quel CPU dans le système. Définir cette valeur sur 1 comme suit signifie que seul CPU 0 peut servir cette interruption :
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
Des virgules peuvent être utilisées pour délimiter les valeurs smp_affinity pour des groupes discrets de 32 bits. Ceci est requis sur les systèmes avec polus de 32 cœurs. Par exemple, l'exemple suivant montre que l'IRQ 40 est servie sur tous les cœurs d'un système de 64 cœurs :
# cat /proc/irq/40/smp_affinity
ffffffff,ffffffff
Pour servir IRQ 40 uniquement sur les 32 cœurs supérieurs d'un système de 64 cœurs, vous devrez effectuer :
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity
# cat /proc/irq/40/smp_affinity
ffffffff,00000000

Note

Sur les systèmes qui prennent en charge le pilotage d'interruptions, la modification du smp_affinity d'une IRQ paramètre le matériel de manière à ce que la décision de servir une interruption avec un CPU en particulier soit prise au niveau du matériel, sans intervention de la part du noyau.