web-dev-qa-db-fra.com

TaskSet ne fonctionne pas sur une gamme de noyaux en isolcus

Préface J'utilise Debian Wheezy avec le noyau 3.2 sur un chipset AMD64. Ma machine a deux noyaux 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 Isolcus = 8,9,10,11,12,13,14,15 à Grub.

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

$ taskset -c 8-15 bash -c 'tandis que vrai; Echo Hello>/dev/null; Fini' &

Jusqu'à présent, le top montre que le cœur 8 chevauche à proximité de 100% d'utilisation. Disons maintenant que je lance à nouveau cette commande:

$ taskset -c 8-15 bash -c 'tandis que vrai; Echo Hello>/dev/null; Fini' &

Maintenant, Top montre que les noyaux 9-15 restent inactifs et les deux processus partageent le noyau 8. Si je le fais à la place:

$ tassert -c 8 bash -c 'tandis que vrai; Echo Hello>/dev/null; Fini' &

$ taskset -c 9 bash -c 'tandis que vrai; Echo Hello>/dev/null; Fini' &

Les noyaux 8 et 9 reçoivent chacun une utilisation de 100% comme elles le devraient. Ceci s'applique uniquement à Isolcus car le même service de tâches avec des noyaux 1 à 7 répand correctement les processus sur les noyaux correspondants. De plus, "TaskSet -P" montre que le masque d'affinité pour les 8-15 processus est correctement défini. Il apparaît que le planificateur de noyau refuse d'utiliser quoi que ce soit, mais le noyau le plus bas spécifié sur un masque d'affinité isolcus.

Normalement, cela ne serait pas un gros problème avec mes exemples ci-dessus, spécifiez simplement des noyaux individuels pour chaque processus. Cependant, je souhaite exécuter une application hautement multithread sur la CPU dédiée. Je souhaite spécifier le jeu de nœuds et utiliser automatiquement le pool de threads, sans avoir à réinitialiser individuellement l'affinité de processeur pour chaque fil individuel qui a engendré.

Quelqu'un a-t-il une idée de comment obtenir le planificateur de me donner plus d'un noyau de l'ensemble Isolcpu?

13
user79126

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

J'ai fini par utiliser strack_rr, mais j'ai aussi testé Sched_FiFo et Sched_idle qui semblent 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 root, vous pouvez utiliser l'utilitaire SetCap pour activer cap_sys_nice sur le fichier binaire relié à la commande)

10
user79126