Jeu de tâches ne fonctionnant pas sur une gamme de cœurs dans isolcpus

13

Pour commencer, j'utilise Debian Wheezy avec le noyau 3.2 sur un chipset AMD64. Ma machine possède deux cœurs Xeon E5-2690. J'ai configuré les paramètres de démarrage afin que tous les cœurs d'un processeur soient dédiés à un seul processus. Pour ce faire, j'ai défini isolcpus = 8,9,10,11,12,13,14,15 dans grub.

Jusqu'ici tout va bien. Maintenant, disons que je veux utiliser les CPU isolés pour une commande donnée, pour être simple, je vais simplement utiliser une boucle infinie simple:

$ taskset -c 8-15 bash -c 'tandis que true; faire écho bonjour> / dev / null; terminé' &

Jusqu'ici tout va bien, top montre que le noyau 8 tourne jusqu'à près de 100% d'utilisation. Supposons maintenant que je lance à nouveau cette commande:

$ taskset -c 8-15 bash -c 'tandis que true; faire écho bonjour> / dev / null; terminé' &

Maintenant, le haut montre que les cœurs 9-15 restent inactifs et que les deux processus partagent le noyau 8. Si je fais cela à la place:

$ taskset -c 8 bash -c 'tandis que true; faire écho bonjour> / dev / null; terminé' &

$ taskset -c 9 bash -c 'true; faire écho bonjour> / dev / null; terminé' &

Les cœurs 8 et 9 obtiennent chacun une utilisation à 100% comme ils le devraient. Cela ne s'applique qu'à isolcpus car le même ensemble de tâches avec les cœurs 1 à 7 répartit correctement les processus sur les cœurs concernés. De plus, "tasket -p" montre que le masque d'affinité pour les processus 8-15 est correctement défini. Il semble que l'ordonnanceur du noyau refuse d'utiliser autre chose que le noyau le plus bas spécifié sur un masque d'affinité isolcpus.

Maintenant, normalement, ce ne serait pas un gros problème avec mes exemples ci-dessus, spécifiez simplement des cœurs individuels pour chaque processus. Cependant, je veux exécuter une application hautement multithread sur le processeur dédié. Je veux spécifier l'ensemble de base et faire en sorte que le pool de threads utilise automatiquement, sans avoir à réinitialiser individuellement l'affinité du processeur pour chaque thread individuel qui est généré.

Quelqu'un a-t-il une idée de comment obtenir le planificateur pour me donner plus d'un cœur de l'ensemble isolcpu?

user79126
la source
pouvez-vous essayer d'utiliser un programme multithread? bash n'est pas multithread
c4f4t0r
1
Oui, c'est à l'origine ce qui m'a fait remarquer (mon programme multithread n'utilisait pas plus d'un core). Un script python simple qui crée un grand nombre de threads ne parvient pas à utiliser plusieurs cœurs lorsqu'il est exécuté sur l'ensemble isolcpus. (Lorsqu'il est exécuté sur les cœurs non isolés, il utilise les 8 cœurs disponibles).
user79126
lire ce linuxtopia.org/online_books/linux_kernel/kernel_configuration/… , cela exclut un cpus du planificateur du noyau, mais après avoir exclu les cpus, vous voulez exécuter le processus sur les cpus exclus?
c4f4t0r
1
Le noyau ne planifiera pas de thread ou de processus sur l'isolcpu sauf si le masque d'affinité du processeur indique qu'il doit être utilisé. Sinon, isolcpus reviendrait à éteindre le cœur, lorsque le but est de réserver un cœur pour une raison spécifiée par l'utilisateur et de s'assurer qu'aucun processus indésirable ne l'utilise. L'ensemble de tâches définit le masque d'affinité pour utiliser tous les cœurs dans la plage 8-15 (qui est correctement défini lors de l'archivage dans / proc), de sorte que le noyau doit planifier le processus sur les cœurs inactifs.
user79126

Réponses:

10

Après une journée de frustration, j'ai trouvé une solution. Ce comportement semble être un artefact de l'algorithme du planificateur de noyau par défaut (SCHED_OTHER pour cette distribution / noyau). Changer le processus en un algorithme différent élimine le problème, les isolcpus sont correctement utilisés dans les processus / threads.

J'ai fini par utiliser SCHED_RR, mais j'ai également testé SCHED_FIFO et SCHED_IDLE qui semblent tous les deux fonctionner. Le processus peut être lancé avec l'algorithme alternatif en utilisant l'utilitaire chrt:

$ sudo chrt -r 1 [commande]

(Si vous souhaitez exécuter en tant que non root, vous pouvez utiliser l'utilitaire setcap pour activer CAP_SYS_NICE sur le fichier binaire lié à la commande)

user79126
la source
1
Bien que l'affectation des tâches à l'affinité avec les cœurs 0,1, mon application Java n'utilisait que le premier cœur. 'sudo chrt -r 1 [commande]' a également résolu mon problème.
Barry NL