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?
Réponses:
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)
la source