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.