Sous Linux, quel est l'inconvénient (s'il y en a un) de désactiver toutes les interruptions sur un cœur de processeur particulier, ou même sur tous les cœurs d'une seule puce dans un système contenant plusieurs puces ? Lorsque j'écris un programme en C qui est extrêmement sensible à la latence, j'ai naturellement tendance à isoler le thread sur son propre cœur et à déplacer toutes les autres tâches sur des cœurs distincts, et je me demande quels sont les compromis.
Réponses
Trop de publicités?Le noyau Linux principal n'est pas conçu pour que toutes les IRQ soient désactivées sur un processeur pendant une période prolongée. Un certain nombre de fonctions internes du noyau nécessitent de telles IRQ, dont la RCU. Un blocage de la RCU peut entraîner et entraînera l'arrêt du reste du système, et éviter un tel blocage peut (en fonction de l'implémentation de la RCU utilisée) impliquer des IPI (interruptions inter-processeurs) diffusées à tous les processeurs.
Cela dit, il existe des correctifs expérimentaux pour mettre en œuvre correctement une telle isolation du processeur ; par exemple : http://lwn.net/Articles/268711/ - Ces derniers effectuent toutes les manœuvres internes nécessaires pour mettre un processeur hors ligne (du point de vue du reste du noyau) avant de désactiver l'acheminement des interruptions. Il s'agit d'une série de correctifs assez ancienne ; vous pouvez contacter le développeur de la série de correctifs pour voir s'ils ont une version plus récente quelque part, ou adapter ces correctifs à la version actuelle du noyau. Les gens de PREEMPT_RT sont supposés chercher à l'implémenter aussi - regardez leur wiki à https://rt.wiki.kernel.org/index.php/Main_Page (elle n'est pas encore mise en œuvre). Nous vous souhaitons bonne chance !
Quelques éléments à prendre en compte :
- Toute IRQ aura un processeur de moins pour fonctionner, ce qui signifie que vous avez plus de chances d'avoir des interruptions en attente. Il est évident que ce problème s'atténue au fur et à mesure que le nombre de processeurs augmente.
- Sans interruptions, il sera beaucoup plus difficile de forcer le processus à abandonner l'exécution. S'il décide d'entrer dans une boucle infinie, vous ne pouvez pas interrompre le processeur pour l'arrêter.
Si vous avez la certitude que le processus abandonnera le contrôle dans un délai raisonnable et que vous n'êtes pas préoccupé par la file d'attente des interruptions, il peut être avantageux de désactiver les interruptions.