web-dev-qa-db-fra.com

Un seul cœur dédié à un seul processus

Existe-t-il un moyen sous Linux d'affecter un cœur de processeur à un processus donné particulier et il ne devrait pas y avoir d'autres processus ou gestionnaires d'interruption à planifier sur ce cœur?

J'ai lu sur l'affinité des processus sous Linux Processus de liaison aux CPU en utilisant l'utilitaire de jeu de tâches mais cela ne résout pas mon problème parce que il essaie juste d'affiner le processus donné à ce noyau mais il est possible que d'autres processus peuvent être programmés sur ce noya et c'est ce que je veux éviter.

Faut-il changer le code du noyau pour la planification?

47
akp

Oui il y a. En fait, il y a deux façons de le faire :-)

À l'heure actuelle, la meilleure façon d'accomplir ce que vous voulez est de procéder comme suit:

  1. Ajoutez le paramètre isolcpus = [cpu_number] à la ligne de commande du noyau Linux à partir du chargeur de démarrage pendant le démarrage. Cela ordonnera au planificateur Linux de ne pas exécuter de tâches régulières sur ce processeur, sauf si spécifiquement demandé en utilisant l'affinité cpu.

  2. Utilisez l'affinité IRQ pour définir d'autres CPU pour gérer toutes les interruptions afin que votre CPU isolé ne reçoive aucune interruption.

  3. Utilisez l'affinité CPU pour fixer votre tâche spécifique au CPU isolé.

Cela vous donnera le meilleur que Linux puisse offrir en ce qui concerne l'isolation du processeur sans correctifs hors arborescence et en cours de développement.

Votre tâche sera toujours interrompue de temps en temps par le code Linux, y compris d'autres tâches - telles que l'interruption de la minuterie et le code du planificateur, les IPI d'autres CPU et des trucs comme les threads du noyau de la file d'attente de travail, bien que l'interruption devrait être assez minime.

Pour une liste (presque) complète des sources d'interruption, consultez ma page à https://github.com/gby/linux/wiki

La méthode alternative consiste à utiliser des cpusets qui sont beaucoup plus élégants et dynamiques mais qui souffrent de certaines faiblesses à ce stade (pas de migration des temporisations par exemple) ce qui me fait recommander l'ancien paramètre isolcpus, brut mais efficace.

Notez que la communauté Linux travaille actuellement pour résoudre tous ces problèmes et plus encore pour mieux isoler.

60
gby

Il y a article Redhat en parle. Il modifie le paramètre de démarrage isolcpus .

Et un ancien article écrit par Robert Love. Et il y a une solution dans cet article.

Tous les enfants d'un processus reçoivent le même masque d'affinité CPU que leur parent.

Ensuite, tout ce que nous devons faire, c'est que init se lie à un processeur. Tous les autres processus, par nature init étant la racine de l'arbre de processus et donc le superparent de tous les processus, sont alors également liés au même processeur.

6
louxiu

Dédiez un cœur de processeur entier à un programme particulier

Bien que l'ensemble de tâches permette d'affecter un programme particulier à certains CPU, cela ne signifie pas qu'aucun autre programme ou processus ne sera planifié sur ces CPU. Si vous souhaitez empêcher cela et dédier un cœur de processeur entier à un programme particulier, vous pouvez utiliser le paramètre de noyau "isolcpus", qui vous permet de réserver le cœur de processeur au démarrage.

Ajoutez le paramètre du noyau "isolcpus =" au chargeur de démarrage pendant le démarrage ou GRUB. Ensuite, le planificateur Linux ne planifiera aucun processus régulier sur le ou les cœurs de processeur réservés, sauf demande spécifique) avec l'ensemble de tâches. Par exemple, pour réserver les cœurs de processeur 0 et 1, ajoutez le paramètre de noyau "isolcpus = 0,1". Au démarrage, puis utilisez l'ensemble de tâches pour affecter en toute sécurité les cœurs de processeur réservés à votre programme.

Sources)

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html
5
Vasu

Même si vous suivez les étapes de la réponse de gby, les tâches du noyau sont exécutées sur le noyau CPU isolé. Des travaux sont en cours dans le projet temps réel linux RT_PREEMPT pour améliorer cela. Donc, si vous n'utilisez pas un noyau Edge en temps réel qui saigne de RP_PREEMPT, il ne sera peut-être pas possible complètement d'isoler un cœur de processeur.

3
bofh.at

Selon documentation

Le planificateur Linux honorera l'affinité CPU donnée et le processus ne s'exécutera sur aucun autre CPU.

Il n'y a aucune mention qu'un processeur spécifique sera donné pour traiter exclusivement.

0
Sergei Nikulov