Avez-vous déjà entendu parler du terme affinité de processeur ? C'est une fonctionnalité qui vous permet de lier ou de dissocier des processus à une unité centrale de traitement particulière ou à une gamme de processeurs. Oui, vous pouvez indiquer au système quel(s) cœur(s) de processeur doit(vent) être utilisé(s) pour exécuter un processus particulier. Pour des détails théoriques sur l'existence de l'affinité de processeur, rendez-vous ici.
Ici, dans ce tutoriel, nous allons discuter d'un utilitaire - appelé taskset - qui vous permet d'atteindre l'affinité du processeur. Mais avant cela, il convient de mentionner que tous les exemples de ce didacticiel ont été testés sur une machine Ubuntu 20.04 LTS et sur Debian 10.
Commande d'ensemble de tâches Linux
La commande taskset vous permet de définir ou de récupérer l'affinité CPU d'un processus. Voici sa syntaxe :
taskset [options] mask command [argument...]
taskset [options] -p [mask] pid
Voici comment la page de manuel de l'outil l'explique :
taskset is used to set or retrieve the CPU affinity of a running
process given its pid, or to launch a new command with a given CPU
affinity. CPU affinity is a scheduler property that "bonds" a process
to a given set of CPUs on the system. The Linux scheduler will honor
the given CPU affinity and the process will not run on any other CPUs.
Note that the Linux scheduler also supports natural CPU affinity: the
scheduler attempts to keep processes on the same CPU as long as practi?
cal for performance reasons. Therefore, forcing a specific CPU affin?
ity is useful only in certain applications.
The CPU affinity is represented as a bitmask, with the lowest order bit
corresponding to the first logical CPU and the highest order bit corre?
sponding to the last logical CPU. Not all CPUs may exist on a given
system but a mask may specify more CPUs than are present. A retrieved
mask will reflect only the bits that correspond to CPUs physically on
the system. If an invalid mask is given (i.e., one that corresponds to
no valid CPUs on the current system) an error is returned. The masks
may be specified in hexadecimal (with or without a leading "0x"), or as
a CPU list with the --cpu-list option. For example,
0x00000001 is processor #0,
0x00000003 is processors #0 and #1,
0xFFFFFFFF is processors #0 through #31,
32 is processors #1, #4, and #5,
--cpu-list 0-2,6
is processors #0, #1, #2, and #6.
When taskset returns, it is guaranteed that the given program has been
scheduled to a legal CPU.
Voici quelques exemples de style questions-réponses qui devraient vous donner une meilleure idée du fonctionnement de la commande taskset.
Q1. Comment utiliser le jeu de tâches pour récupérer l'affinité CPU d'un processus ?
Si vous souhaitez que l'ensemble de tâches affiche l'affinité CPU d'un processus déjà en cours d'exécution, utilisez la commande de la manière suivante :
taskset -p [PID]
Remplacez simplement PID par l'ID du processus dont vous souhaitez récupérer l'affinité CPU. Par exemple :
taskset -p 9726
La commande ci-dessus a renvoyé le résultat suivant :
Masque d'affinité actuel dupid 9726's current affinity mask: f
Ainsi, la valeur hexadécimale 'f' signifie ici que le processus peut s'exécuter sur n'importe lequel des 4 cœurs de processeur :0,1,2,3.
Si vous souhaitez que la sortie soit en termes de plage de CPU, vous pouvez ajouter l'option de ligne de commande -c.
taskset -cp 9726
Voici la sortie dans ce cas :
pid 9726's current affinity list: 0-3
Q2. Comment modifier l'affinité du processeur à l'aide de l'ensemble de tâches ?
Pour modifier l'affinité CPU d'un processus existant, vous devez spécifier l'ID de processus (comme nous l'avons fait dans la section précédente) avec un masque hexadécimal qui définit la nouvelle affinité.
Par exemple, l'affinité CPU actuelle du processus Gedit (PID :9726) est 'f'.
Pour changer l'affinité en 0x11, utilisez la commande suivante :
taskset -p 0x11 9726
Et ensuite, vous pouvez à nouveau vérifier la nouvelle affinité à l'aide de la commande suivante :
taskset -p 9726
Les captures d'écran suivantes montrent les sorties de ces commandes dans mon cas :
Vous pouvez donc voir que l'affinité a été modifiée.
Q3. Comment attribuer une plage de CPU tout en changeant d'affinité ?
Ce n'est pas grave. Tout ce que vous avez à faire est d'ajouter l'option de ligne de commande -c à la commande que nous avons utilisée dans la section précédente avec la plage de cœurs du processeur en entrée.
Voici un exemple :
ensemble de tâches -cp 0,3 9726
Ce qui suit est la sortie produite dans ce cas :
pid 9726's current affinity list: 0
pid 9726's new affinity list: 0,3
Q4. Comment lancer un processus avec une affinité CPU prédéfinie ?
Oui, vous pouvez également lancer un processus avec une affinité CPU définie.
Par exemple, j'ai lancé l'éditeur de texte gedit avec l'affinité CPU 0xa.
ensemble de tâches 0xa gedit
Conclusion
D'accord, la commande taskset n'est pas destinée à un utilisateur de ligne de commande moyen. Il est principalement utilisé par les experts côté serveur pour l'optimisation des processus dans un environnement multicœur. Nous avons discuté des bases de l'outil ici. Pour plus d'informations, rendez-vous sur sa page de manuel.