Utilisation d'un seul cœur de processeur


9

J'ai besoin d'exécuter des tests de performances pour mon programme simultané et mon exigence est qu'il ne doit être exécuté que sur un seul cœur de processeur. (Je ne veux pas de threads coopératifs - je veux toujours avoir un changement de contexte).

J'ai donc deux questions:

  1. La meilleure solution - Comment signer et réserver un seul cœur de processeur uniquement pour mon programme (pour forcer le système d'exploitation à ne pas utiliser ce cœur de processeur). Je suppose que ce n'est pas possible mais peut-être que je me trompe ...

  2. Comment configurer Linux (Fedora 24) pour utiliser un seul cœur de processeur?



1
Notez que les processeurs modernes peuvent changer leur vitesse en fonction du nombre de cœurs utilisés au total. Même si vous vous assurez que votre processus n'utilise qu'un seul cœur et qu'aucun autre processus ne l'utilise, la vitesse de ce cœur différera selon la façon dont le système d'exploitation utilisera les autres cœurs. Tenez-en compte lors de l'exécution de vos tests.
liori

Vous devriez pouvoir désactiver les cœurs de processeur du BIOS, peut-être est-il plus fiable pour vos tests comme @liori l'a indiqué ci-dessus que le système d'exploitation pourrait modifier la vitesse du cœur.
Marcs

Qu'en est-il de la création d'une machine virtuelle et de l'affectation d'un seul cœur à celle-ci? Oh, je viens de lire le "ne pas utiliser ce cœur de processeur" alors tant
pis

Réponses:


26

Sous Linux, l'appel système pour définir l'affinité CPU pour un processus est sched_setaffinity. Ensuite, il y a l' tasksetoutil pour le faire sur la ligne de commande.

Pour que ce programme unique s'exécute sur un seul processeur, je pense que vous voudriez quelque chose comme

taskset -c 1 ./myprogram

(définissez n'importe quel numéro de CPU comme argument du -ccommutateur.)

Cela devrait être assez proche d'un système à processeur unique, tant que vos autres processus ne s'exécutent pas trop par rapport à celui que vous souhaitez mesurer, ou qu'ils sont planifiés sur d'autres processeurs. Si vous voulez consacrer un CPU à ce processus unique seulement , et empêcher d' autres processus en cours d' exécution de ce CPU, vous aurez besoin de définir leur affinité aussi.

Ça, je ne sais pas comment faire correctement. Vous devez définir l'affinité du processeur inittrès tôt dans le processus de démarrage pour vous assurer qu'il est hérité de tous les processus du système. Comme solution de contournement, vous pouvez utiliser taskset -c -p 0 $PIDtous les autres processus pour les forcer à s'exécuter uniquement sur le CPU # 0.

systemd a égalementCPUAffinity= pour contrôler l'affinité dans les fichiers de l' unité et il y a deux ou trois de la question sur la définition de l'affinité par défaut ici sur unix.SE, mais je ne ai trouvé aucun avec une bonne solution.

Bien que @Kamil Maciorowski ait commenté et répondu à une autre question sur superuser.com , la configuration isolcpus=1 sur la ligne de commande du noyau devrait "isoler ce CPU des algorithmes de planification généraux", ce que vous voudrez peut-être.


Cela ne répond pas tout à fait à la question. Bien que l'ensemble de tâches (ou d'autres méthodes de définition de l'affinité des tâches) garantisse qu'un processus s'exécute uniquement sur l'ensemble de cœurs spécifié, il ne garantit pas que seul ce processus s'exécutera sur ces cœurs. C'est-à-dire que le système d'exploitation pourrait planifier d'autres processus sur le cœur auquel vous avez défini votre affinité de processus. Dans la pratique, c'est la réponse la plus utile, mais soyez conscient des limites, et en particulier sachez qu'elle ne donne pas ce que vous demandez en 1) "ne réserver qu'un seul cœur de processeur uniquement pour mon programme (pour forcer le système d'exploitation à pas utiliser ce noyau cpu) "
James Greenhalgh

@JamesGreenhalgh, mais trouver un moyen de définir l'affinité CPU pour chaque processus répondrait à la question. Est-il possible de définir une affinité cpu par défaut pour les nouveaux processus, comme option de noyau (ligne cmd)? Cela prendrait effet au début du processus de démarrage et affecterait tous les processus.
jpaugh

En fait, j'ai manqué la clause entre parenthèses pour empêcher d'autres processus de s'exécuter sur ce processeur. Ou peut-être que je pensais que le plus gros problème serait de s'assurer que le programme en question ne fonctionnerait que sur un seul cœur, au lieu de quatre, et que les autres processus pourraient être considérés comme une sorte de nuisance, ce qui n'aurait pas beaucoup d'importance par rapport à cela. Mais je dois admettre que je n'avais pas de bonne réponse à cette partie de la question, à part ce que Kamil a commenté maintenant.
ilkkachu

@jpaugh, je pense que même dans ce cas, vous ne pourrez pas vous isoler complètement de la possibilité qu'un autre processus s'exécute sur "votre" cœur. Par exemple, celui qui réinitialise sa propre affinité, ou même le code du noyau lui-même consommant du temps sans rapport avec la gestion de votre processus. Encore une fois, je suis entièrement d'accord que dans la pratique, cette réponse est ce que la plupart feraient pour résoudre la majeure partie du problème, mais je serais vraiment intéressé à lire une réponse à cette dernière partie entre parenthèses!
James Greenhalgh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.