Déterminer le processeur particulier sur lequel un processus s'exécute

10

J'ai accès à un nœud à 8 cœurs d'un cluster Linux. Une fois connecté au nœud, je peux voir une liste de processeurs à l'aide de cette commande:

more /proc/cpuinfo

Dans mon nœud à 8 cœurs, les processeurs sont numérotés de 0 à 7. Chaque processeur est un processeur Intel Xeon (E5430 @ 2,66 GHz).

Supposons maintenant que j'appelle le programme fooavec quelques arguments args:

foo args

Le programme fooest long à exécuter (heures ou jours, par exemple). Après avoir appelé foo, est-il possible de déterminer le processeur particulier (c.-à-d. 0 à 7) sur lequel foofonctionne? Le topprogramme me montre l'ID du processus et des informations similaires, mais je ne vois pas le numéro du processeur . Ces informations sont-elles disponibles?

Andrew
la source
1
À moins que vous n'ayez fait quelque chose de spécifique, le processus ne restera pas sur le même CPU tout le temps. Pourquoi avez-vous besoin de ces informations?
Mat
@Mat Merci pour votre temps. Il s'agit d'une question distincte, mais en fin de compte, je voudrais voir si je peux affecter deux appels fooà deux processeurs différents. Quand j'appelle fooune fois, ça tourne à %CPUtrès près de 100% (selon top). Mais quand j'appelle fooune seconde fois, les deux fooprocessus sont exécutés de telle sorte que le %CPUpour les deux procédés somme à moins de 100% (habituellement d' environ 45% pour chaque fooprocessus). Pour moi, cela suggère que les deux appels à foos'exécutent sur le même processeur (même s'il existe huit processeurs disponibles); Je voudrais vérifier que c'est le cas.
Andrew
1
Le terme est appelé affinité de processeur
slm
1
L'ordonnanceur permet aux choses de s'exécuter sur plusieurs processeurs (différents) .... CEPENDANT, votre programme doit être construit comme un programme multithread pour profiter de l'utilisation de traitements multiples simultanés sur un programme ou une tâche spécifique. Selon qui programme l'application, les programmes java tentent de le faire.
mdpc

Réponses:

11

pspeut vous fournir ces informations si vous demandez la psrcolonne (ou utilisez l' -Findicateur qui l'inclut).

Ex:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

Ou:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

Mon shell fonctionnait sur le CPU 2 lorsque j'ai exécuté la première commande, sur le CPU 0 lorsque j'ai exécuté la seconde. Attention, les processus peuvent changer très, très rapidement les processeurs, donc les informations que vous voyez sont, en fait, déjà périmées.

Quelques informations supplémentaires dans les réponses à cette question de super utilisateur:

Linux: commande pour connaître le numéro de processeur dans lequel un processus est chargé?

Tapis
la source
4

Avec le topfrom procps(généralement la distribution par défaut sur les distributions Linux de nos jours), dans top, appuyez sur f, accédez à P = Last User CPU (SMP)et appuyez sur Spacepour sélectionner (vous pouvez également déplacer le champ par exemple avant le COMMANDchamp avec la Righttouche, puis monter et descendre). qpour revenir à l'écran principal (où vous verrez votre processus passer d'un processeur à l'autre, sauf si vous l'avez explicitement configuré pour rester avec un). Vous pouvez appuyer sur Wpour l'enregistrer par défaut.

Appuyez ?pour obtenir de l'aide.

Stéphane Chazelas
la source
4

La commande tasksetest ce que vous recherchez:

ensemble de tâches - récupérer ou définir l'affinité CPU d'un processus

Exemple

$ taskset -p 12345
pid 12345's current affinity mask: f

Un masque de ftous les processeurs, 0x00000001serait juste le processeur 0.

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

Affiche les processeurs sous forme de liste. J'ai 4 cœurs sur mon ordinateur portable dans cet exemple.

Voir la page de manuel a plus de détails .

slm
la source
1

Vous pouvez également obtenir ces informations directement auprès de /proc/[pid]/stat. Il s'agit du 39e champ délimité par des espaces (depuis Linux 2.2.8).

Par exemple, pour afficher sur quel processeur CPU le shell actuel s'exécute (dans ce cas):

cat  /proc/$$/stat | cut -d' ' -f39
drgnfr
la source