Explication de PREEMPT_RT : Fonctionnalités du noyau en temps réel
PREEMPT_RT transforme le noyau Linux en un système d'exploitation temps réel, garantissant une synchronisation précise pour les tâches critiques. Intégré à Linux 6.12 (sortie le 20 septembre 2024), il offre des fonctionnalités temps réel pour les architectures telles que x86, ARM64 et RISC-V. Voici ce qu'il faut savoir :
- Caractéristiques principales:
- Remplace les verrous de rotation traditionnels par des verrous de veille préemptibles.
- Convertit les gestionnaires d'interruptions en threads, les rendant planifiables et préemptibles.
- Met en œuvre l'héritage de priorité pour résoudre les problèmes d'inversion de priorité.
- Rend les opérations RCU (Lecture-Copie-Mise à jour) entièrement préemptibles.
- Applications:
- Utilisé dans des secteurs comme l'automobile, la robotique, les télécommunications et les dispositifs médicaux où la précision du timing est essentielle.
- Alimente des systèmes tels que les outils d'automatisation industrielle, les commandes de vol et les environnements d'hébergement nécessitant serveurs privés virtuels à faible latence.
- Installation:
- Activer
CONFIG_PREEMPT_RTdans la configuration du noyau. - Affinez les paramètres comme
CONFIG_NO_HZ_FULLetCONFIG_RCU_BOOSTpour des performances optimales. - Utilisez des outils comme
test cycliquepour mesurer la latence et valider les performances.
- Activer
PREEMPT_RT privilégie la rapidité au débit, ce qui rend Linux adapté aux applications où les délais sont impératifs. C'est un atout majeur pour les secteurs exigeant des performances constantes.
Fonctionnalités principales de PREEMPT_RT : Comment Linux atteint des performances en temps réel
PREEMPT_RT expliqué : Création et optimisation du noyau Linux pour le temps réel et une latence ultra-faible
sbb-itb-59e1987
Fonctionnalités principales de PREEMPT_RT
PREEMPT_RT se concentre sur quatre fonctionnalités principales conçues pour réduire le code non préemptible et améliorer le contrôle de la planification des tâches. Voici un aperçu plus détaillé de chacune d'elles.
Préemption complète du noyau
L'une des plus importantes mises à jour consiste à transformer les verrous de rotation standard (spinlock_t) et les verrous de lecteur-écrivain (rwlock_t) dans verrous de rotation dormants basés sur des mutex. Les verrous d'attente active traditionnels peuvent engendrer des délais car ils désactivent la préemption, contraignant les tâches à une attente active. PREEMPT_RT remédie à cela en introduisant des verrous qui permettent aux tâches de se mettre en veille et d'être préemptées, même lorsqu'elles utilisent une ressource.
Cela signifie que les tâches prioritaires peuvent interrompre les tâches moins prioritaires, même si ces dernières détiennent des verrous. Cependant, pour certaines opérations critiques – comme le planificateur ou les points d'entrée matériels – PREEMPT_RT conserve raw_spinlock_t, qui se comporte comme les verrous non préemptibles d'origine. Comme l'explique Paul McKenney, ingénieur émérite :
" L’objectif principal du correctif PREEMPT_RT est de minimiser la quantité de code du noyau non préemptible, tout en minimisant la quantité de code qui doit être modifiée pour assurer cette préemptibilité supplémentaire. "
Voyons maintenant comment la gestion des interruptions bénéficie de cette approche.
Interruptions multithread
PREEMPT_RT déplace la plupart des gestionnaires d'interruptions matérielles du contexte " IRQ matérielle " vers threads du noyau L'exécution se fait dans le contexte du processus. Ce réglage permet de prioriser, de préempter, voire de bloquer les gestionnaires d'interruptions.
Dans un noyau Linux standard, un gestionnaire d'interruptions de longue durée peut entraîner une latence illimitée car il interrompt toute autre exécution. Les interruptions multithreadées résolvent ce problème. Par défaut, ces threads d'interruption s'exécutent avec un SCHED_FIFO priorité de 50, mais les administrateurs peuvent ajuster leurs priorités à l'aide d'outils comme char. Par exemple, il est possible de prioriser l'interruption d'une carte réseau pour le contrôle industriel tout en abaissant la priorité des E/S disque. Comme ces threads utilisent des verrous de spin différés plutôt que des verrous de spin bruts, il n'est pas nécessaire de désactiver les interruptions matérielles pendant la détention d'un verrou.
À présent, explorons comment PREEMPT_RT gère les problèmes liés aux priorités.
Héritage de priorité et Rtmutex
Inversion de priorité Il s'agit d'un problème majeur où une tâche prioritaire se retrouve bloquée en attente d'une ressource détenue par une tâche non prioritaire, tandis qu'une tâche de priorité moyenne (qui n'a pas besoin de la ressource) préempte la tâche non prioritaire. PREEMPT_RT résout ce problème. héritage prioritaire, en augmentant temporairement la priorité de la tâche de faible priorité pour qu'elle corresponde à celle de la tâche de priorité la plus élevée en attente de la ressource.
Le rtmutex L'outil `primitive` rend cela possible. Il garantit qu'en cas de conflit, la tâche de faible priorité bénéficie d'une augmentation de priorité pour achever sa partie critique sans interférence des tâches de priorité moyenne. Si cette tâche est bloquée par un autre verrou, l'augmentation de priorité se propage à l'ensemble de la chaîne de dépendances. Comme l'explique la documentation du noyau Linux :
" L’héritage de priorité permet aux applications bien conçues d’utiliser des verrous d’espace utilisateur dans des parties critiques d’un thread à haute priorité, sans perdre le déterminisme. "
Pour y parvenir, rtmutex utilise un indicateur et un arbre de priorité pour gérer les tâches en attente, ce qui permet de limiter la surcharge sur les architectures prises en charge.
Enfin, examinons comment PREEMPT_RT améliore les opérations RCU.
RCU préemptible (Lecture-Copie-Mise à jour)

Read-Copy-Update (RCU) est une technique de synchronisation largement utilisée dans le noyau Linux. Dans les noyaux standard, les sections de lecture RCU ne sont pas préemptibles, ce qui peut entraîner des délais imprévisibles. PREEMPT_RT modifie ce comportement en rendant les sections de lecture RCU préemptibles. entièrement préemptible, afin de garantir le respect des délais des tâches en temps réel. Cet ajustement est fondamental pour obtenir le comportement prévisible requis par les systèmes temps réel.
Comment configurer et utiliser PREEMPT_RT
PREEMPT_RT est entièrement intégré aux noyaux Linux principaux, ce qui signifie que les correctifs externes ne sont plus nécessaires. Cependant, l'application des derniers correctifs reste recommandée pour une meilleure prise en charge des architectures et des performances graphiques améliorées. Une fois le noyau prêt, vous devrez ajuster ses paramètres pour exploiter pleinement ses capacités.
Paramètres de configuration du noyau
Pour activer un noyau entièrement préemptif, activez CONFIG_PREEMPT_RT. Dans les noyaux plus récents, ce paramètre se trouve dans " Configuration générale ", mais vous devrez peut-être l'activer. EXPERT EN CONFIGURATION Il faut d'abord le rendre visible dans le menu de configuration.
Pour la production serveurs dédiés et dans d'autres environnements à hautes performances, des options supplémentaires permettent d'optimiser davantage les performances :
CONFIG_NO_HZ_FULL: Réduit les interruptions d'horloge de planification sur les processeurs occupés, ce qui contribue à minimiser les fluctuations.CONFIG_RCU_BOOST: Empêche les lecteurs RCU préemptés de retarder les délais de grâce.CONFIG_RCU_NOCB_CPU: Décharge la gestion des rappels RCU sur des processeurs spécifiques, réduisant ainsi les interférences avec les tâches en temps réel.
Il est également essentiel de désactiver les options de débogage susceptibles d'entraîner une latence élevée. Désactivez les paramètres tels que : CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_OBJECTS, et CONFIG_SLUB_DEBUG. Bien que ces outils soient utiles au développement, ils peuvent nuire considérablement aux objectifs de latence. Comme l'explique kernelconfig.io :
" Cette option transforme le noyau en un noyau temps réel en remplaçant diverses primitives de verrouillage (verrous d'attente active, verrous de lecture/écriture, etc.) par des variantes préemptibles prenant en compte l'héritage de priorité. "
Une fois votre noyau compilé et démarré, vérifiez que PREEMPT_RT est actif en exécutant la commande suivante : cat /sys/kernel/realtime. Une valeur de retour de 1 indique le succès. Vous pouvez également le vérifier en recherchant " PREEMPT_RT " dans la sortie de uname -a.
Débogage et optimisation des performances
Un réglage précis du noyau est essentiel pour obtenir des performances optimales avec les charges de travail en temps réel. Un point clé à aborder est le mécanisme de limitation en temps réel, qui réserve par défaut 50 ms par seconde aux tâches non temps réel. Si votre charge de travail est exclusivement temps réel, vous pouvez désactiver ce mécanisme en écrivant -1 à /proc/sys/kernel/sched_rt_runtime_us. Comme le souligne Jan Altenberg, consultant senior en logiciels libres chez OSADL :
" Une tâche temps réel "emballée" peut saturer le système. À titre de mécanisme de protection, la durée d'exécution des tâches temps réel peut être limitée en définissant une valeur en microsecondes dans /proc/sys/kernel/sched_rt_runtime_us. ‘
Pour un déterminisme accru, isolez des cœurs de processeur spécifiques à l'aide de paramètres tels que isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, et ensemble irqaffinité=0. Cela réserve ces cœurs exclusivement aux tâches en temps réel.
Pour gérer les threads d'interruption, utilisez le char outil. Ces threads s'exécutent généralement avec un outil par défaut SCHED_FIFO La priorité est de 50, mais vous pouvez la modifier pour éviter les conflits avec votre application. Par exemple, pour définir la priorité du thread IRQ d'une carte réseau à 98, utilisez la commande : chrt -p -f 98.
Une fois la configuration terminée, il est crucial de tester et de valider les performances de latence. Des outils comme test cyclique peut mesurer la latence (par exemple, cyclictest -S -m -p98 -i250), alors que rtla L'analyse Linux en temps réel permet d'identifier et d'analyser les pics de latence. Ces outils garantissent que votre configuration répond aux exigences des applications en temps réel.
Applications et avantages de PREEMPT_RT
Cas d'utilisation d'applications en temps réel
PREEMPT_RT excelle dans les systèmes où la précision temporelle est non négociable. aérospatial, elle garantit que la navigation et les commandes de vol fonctionnent sans délai de microsecondes, ce qui pourrait autrement compromettre la sécurité. Télécommunications Les entreprises comptent sur lui pour gérer le routage des données en temps réel, garantissant ainsi des appels vocaux et vidéo fluides en éliminant les saccades et les pics de latence.
Dans le industrie automobile, c'est une pierre angulaire des systèmes de contrôle des véhicules, et des acteurs majeurs comme Continental Automotive soutiennent son adoption. automatisation industrielle, PREEMPT_RT alimente les automates programmables (PLC) et les systèmes SCADA, fonctionnant souvent en parallèle avec des protocoles comme EtherCAT pour maintenir la sécurité et l'efficacité dans les usines. Robotique Elle s'appuie également fortement sur cette technologie pour un contrôle précis des actionneurs et un retour d'information instantané des capteurs, permettant aux robots de réagir immédiatement aux changements environnementaux.
Les applications les plus critiques se trouvent peut-être dans dispositifs médicaux, Là où la précision est primordiale, des moniteurs de patients aux robots chirurgicaux, PREEMPT_RT offre les performances déterministes nécessaires au bon fonctionnement des systèmes vitaux.
Avantages pour les environnements d'hébergement
Les avantages de PREEMPT_RT s'étendent aux environnements d'hébergement, où la réactivité en temps réel est tout aussi cruciale. Serveurs VPS et dédiés, Cela minimise la latence en permettant au planificateur de prioriser les tâches critiques par rapport aux tâches à haute priorité. Ceci garantit des temps de réponse constants, ce qui influe directement sur l'expérience utilisateur et la fiabilité du service.
Le modèle d'interruption par thread empêche les " tempêtes d'interruptions " de submerger les systèmes lors d'opérations d'E/S intensives. rt_mutex, L'héritage de priorité garantit que les tâches d'arrière-plan de faible priorité ne bloquent pas les services d'hébergement critiques. Les minuteurs haute résolution permettent une précision de planification à la microseconde près, réduisant ainsi les fluctuations dans les environnements virtualisés. Les fournisseurs d'hébergement, comme Serverion, proposent des versions personnalisées du noyau avec PREEMPT_RT, offrant aux administrateurs la possibilité d'ajuster finement les configurations pour des charges de travail spécifiques. En utilisant des paramètres comme isolcpus et irqaffinité, Les fournisseurs peuvent ainsi dédier des cœurs de processeur aux tâches critiques en termes de performances tout en isolant les opérations système courantes.
Conclusion
Ce guide a exploré en détail comment PREEMPT_RT Cette technologie transforme Linux en un système d'exploitation temps réel en conférant au planificateur un contrôle quasi total. Depuis son intégration aux noyaux Linux principaux à partir de la version 6.12 (septembre 2024), elle a éliminé le besoin de correctifs externes sur des architectures telles que x86, ARM64 et RISC-V.
Le concept est simple : réduire au maximum le code non préemptible. En convertissant les verrous d'attente active en verrous de veille et en exécutant les gestionnaires d'interruptions sous forme de threads, les tâches prioritaires peuvent préempter la quasi-totalité des activités du noyau. Des fonctionnalités telles que l'héritage de priorité empêchent les tâches non prioritaires de retarder les opérations critiques, tandis que l'unité de contrôle de lecture (RCU) préemptible garantit que même les sections critiques en lecture n'entraînent pas de retards significatifs. Sebastian Siewior, comme le déclare à juste titre le responsable de PREEMPT_RT :
"Tout le contrôle est entre les mains du planificateur."
Ce bond technologique offre des avantages pratiques. Par exemple, Serverion utilise des versions personnalisées du noyau PREEMPT_RT pour affiner l'isolation du processeur et optimiser les charges de travail en temps réel, garantissant des temps de réponse stables même sous une forte pression d'E/S.
Ce qui distingue les systèmes temps réel, ce n'est pas seulement la vitesse, mais aussi la prévisibilité. PREEMPT_RT minimise les variations de performances, garantissant ainsi l'exécution précise des tâches au moment opportun. Ceci est crucial pour des applications telles que l'automatisation industrielle, les télécommunications et les services d'hébergement critiques. Il offre un comportement déterministe que les noyaux standards ne peuvent tout simplement pas fournir.
Grâce à son intégration au noyau Linux principal et au soutien de distributions d'entreprise comme Ubuntu Pro Depuis février 2023, PREEMPT_RT est plus accessible aux hébergeurs et aux administrateurs système. Il offre les performances fiables et à faible latence requises pour les environnements les plus exigeants et les plus sensibles au facteur temps.
FAQ
Ai-je besoin de PREEMPT_RT ou Linux standard est-il suffisant ?
Le noyau Linux standard, lorsqu'il est combiné avec le Correctif PREEMPT_RT, Il acquiert des capacités temps réel. Cela en fait un choix judicieux pour les applications où une faible latence et des temps de réponse constants sont essentiels. Cependant, à lui seul, le noyau Linux principal peut ne pas suffire à répondre aux exigences strictes du temps réel.
L'option PREEMPT_RT va-t-elle réduire le débit global de mon système ?
Pour obtenir des performances en temps réel, PREEMPT_RT Cette approche vise à réduire le code noyau non préemptible, ce qui contribue à améliorer la réactivité du système. Bien qu'elle puisse entraîner une légère baisse du débit global, elle garantit un comportement constant et prévisible, essentiel pour les applications temps réel. Ce compromis est intentionnel et indispensable pour répondre aux exigences des systèmes temps réel.
Quel objectif de latence est réaliste avec PREEMPT_RT ?
Avec PREEMPT_RT, Atteindre une latence de l'ordre de la milliseconde est un objectif réaliste pour les systèmes de bureau et embarqués. Cependant, les performances réelles dépendent fortement de la configuration et de l'optimisation du système en fonction des exigences spécifiques. Une configuration adéquate est essentielle pour garantir le niveau de réactivité souhaité.