29.4. Aperçu d'une demande d'interruption
Une demande d'interruption ou IRQ est un signal d'attention immédiate envoyé par un matériel à un processeur. Chaque périphérique d'un système se voit attribuer un ou plusieurs numéros d'IRQ qui lui permettent d'envoyer des interruptions uniques. Lorsque les interruptions sont activées, un processeur qui reçoit une demande d'interruption interrompt immédiatement l'exécution de l'application en cours afin de répondre à la demande d'interruption.
Étant donné que les interruptions interrompent le fonctionnement normal, des taux d'interruption élevés peuvent gravement dégrader les performances du système. Il est possible de réduire le temps pris par les interruptions en configurant l'affinité d'interruption ou en envoyant un certain nombre d'interruptions de moindre priorité dans un lot (coalescence d'un certain nombre d'interruptions).
Les demandes d'interruption sont associées à une propriété d'affinité, smp_affinity
, qui définit les processeurs qui traitent la demande d'interruption. Pour améliorer les performances de l'application, attribuez l'affinité d'interruption et l'affinité de processus au même processeur ou aux processeurs du même cœur. Cela permet aux threads d'interruption et d'application spécifiés de partager des lignes de cache.
Sur les systèmes qui prennent en charge le pilotage des interruptions, la modification de la propriété smp_affinity
d'une demande d'interruption configure le matériel de telle sorte que la décision de gérer une interruption avec un processeur particulier est prise au niveau du matériel, sans intervention du noyau.
29.4.1. Équilibrer les interruptions manuellement
Si votre BIOS exporte sa topologie NUMA, le service irqbalance
peut automatiquement servir les demandes d'interruption sur le nœud local du matériel demandant le service.
Procédure
- Vérifiez quels appareils correspondent aux demandes d'interruption que vous souhaitez configurer.
Recherchez les spécifications matérielles de votre plate-forme. Vérifiez si le chipset de votre système prend en charge la distribution des interruptions.
- Si c'est le cas, vous pouvez configurer la distribution des interruptions comme décrit dans les étapes suivantes. En outre, vérifiez l'algorithme utilisé par votre chipset pour équilibrer les interruptions. Certains BIOS disposent d'options permettant de configurer l'acheminement des interruptions.
- Si ce n'est pas le cas, votre chipset achemine toujours toutes les interruptions vers une seule unité centrale statique. Vous ne pouvez pas configurer l'unité centrale utilisée.
Vérifiez le mode APIC (Advanced Programmable Interrupt Controller) utilisé sur votre système :
$ journalctl --dmesg | grep APIC
Here,
-
Si votre système utilise un mode autre que
flat
, vous pouvez voir une ligne similaire àSetting APIC routing to physical flat
. Si vous ne voyez aucun message de ce type, votre système utilise le mode
flat
.Si votre système utilise le mode
x2apic
, vous pouvez le désactiver en ajoutant l'optionnox2apic
à la ligne de commande du noyau dans la configurationbootloader
.Seul le mode plat non physique (
flat
) permet de distribuer les interruptions à plusieurs CPU. Ce mode n'est disponible que pour les systèmes comportant jusqu'à8
CPU.
-
Si votre système utilise un mode autre que
-
Calculez le
smp_affinity mask
. Pour plus d'informations sur la manière de calculer lesmp_affinity mask
, voir Définition du masque d'affinité smp_affinity.
Ressources supplémentaires
-
journalctl(1)
ettaskset(1)
pages de manuel
29.4.2. Définition du masque d'affinité smp_affinity
La valeur smp_affinity
est stockée sous la forme d'un masque de bits hexadécimaux représentant tous les processeurs du système. Chaque bit configure un processeur différent. Le bit le moins significatif correspond à l'unité centrale 0.
La valeur par défaut du masque est f
, ce qui signifie qu'une demande d'interruption peut être traitée par n'importe quel processeur du système. La valeur 1 signifie que seul le processeur 0 peut gérer l'interruption.
Procédure
En binaire, utilisez la valeur 1 pour les unités centrales qui gèrent les interruptions. Par exemple, pour configurer l'unité centrale 0 et l'unité centrale 7 afin qu'elles gèrent les interruptions, utilisez
0000000010000001
comme code binaire :Tableau 29.1. Bits binaires pour les CPU UNITÉ CENTRALE
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Binaire
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
Convertir le code binaire en hexadécimal :
Par exemple, pour convertir le code binaire en utilisant Python :
>>> hex(int('0000000010000001', 2)) '0x81'
Sur les systèmes comportant plus de 32 processeurs, vous devez délimiter les valeurs
smp_affinity
pour des groupes discrets de 32 bits. Par exemple, si vous souhaitez que seuls les 32 premiers processeurs d'un système à 64 processeurs répondent à une demande d'interruption, utilisez0xffffffff,00000000
.La valeur d'affinité d'interruption pour une demande d'interruption particulière est stockée dans le fichier
/proc/irq/irq_number/smp_affinity
associé. Définissez le masquesmp_affinity
dans ce fichier :# echo mask > /proc/irq/irq_number/smp_affinity
Ressources supplémentaires
-
journalctl(1)
,irqbalance(1)
, ettaskset(1)
pages de manuel