Comment puis-je voir dans quel processeur un thread S'exécute?

sous Linux, en supposant que le pid d'un thread est [pid], à partir du répertoire /proc/[pid] nous pouvons obtenir de nombreuses informations utiles. Par exemple, ces fichiers proc, /proc/[pid]/statut/proc/[pid]/stat et /proc/[pid]/schedstat sont tous utiles. Mais comment puis-je obtenir le numéro du noyau CPU dans lequel un thread est lancé? Si un thread est en état de veille, Comment puis-je savoir quel core il fonctionnera après qu'il soit programmé à nouveau?

BTW, est-il un moyen de vider le processus(thread) de la liste de course et de tâches de sommeil pour chaque noyau CPU?

39
demandé sur flypen 2011-11-07 07:12:17

6 réponses

la réponse ci-dessous n'est plus exacte à partir de 2014

tâches ne dorment dans aucun noyau particulier. Et le planificateur ne saura pas à l'avance sur quel noyau il lancera un thread car cela dépendra de l'utilisation future de ces noyaux.

Pour obtenir les informations que vous voulez, regardez dans /proc//tâche//l'état. Le troisième champ sera un " R " si le thread est en cours d'exécution. Le sixième du dernier champ sera le core le thread est actuellement cours d'exécution, ou la base ce dernier a couru sur le (ou a été migré vers) si ce n'est pas en cours d'exécution.

31466 (colombie-britannique) S 31348 31466 31348 34819 31466 4202496 2557 0 0 0 5006 16 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264232056 217976807456 0 0 0 137912326 18446744071581662243 0 0 17 3 0 0 0 0 0

Pas actuellement exécuter. Dernière course sur core 3.

31466 (colombie-britannique) R 31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264231824 4235516 0 0 0 2 0 0 0 17 2 0 0 0 0 0

tourne actuellement sur core 2.

pour voir ce que signifie le reste des champs, regardez la source du noyau Linux -- en particulier la fonction do_task_stat dans fs/proc/array.c ou Documentation/filesystems/stat.txt .

notez que toutes ces informations peuvent être obsolètes au moment où vous les recevez. C'était vrai à un certain moment entre le moment où vous avez fait le open appel sur le fichier proc et lorsque cet appel renvoyé.

30
répondu David Schwartz 2017-12-27 20:06:56

la commande "top" peut aider à cela, elle n'a pas de liste de threads groupés par CPU, mais vous pouvez voir la liste des threads (probablement pour un seul processus) et les cœurs de CPU sur lesquels les threads sont exécutés par

top -H -p {PROC_ID}

puis presser f pour aller dans la sélection de champ, j pour activer la colonne de base CPU, et entrer pour afficher.

33
répondu maltanar 2014-08-21 08:45:43

les threads ne sont pas nécessaires pour lier un noyau particulier (si vous ne l'avez pas épinglé). Par conséquent, pour voir la commutation continue du noyau que vous pouvez utiliser (une réponse modifiée de Dmitry):

watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep BINARY-NAME\`

par exemple:

watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep firefox\`
8
répondu Monir 2014-12-15 16:55:25

vous pouvez aussi utiliser ps , quelque chose comme ceci:

ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
7
répondu Dmitry Vyal 2014-08-21 08:44:20

cela peut être fait avec top commande. La commande par défaut top n'affiche pas ces détails. Pour afficher ce détail, vous devrez appuyer sur f "key alors que sur l'interface de commande de haut et puis appuyer sur j (appuyez sur Enter key après avoir appuyé sur j ). Maintenant, la sortie va vous montrer les détails concernant un processus et quel processeur son fonctionnement. Une sortie d'échantillon est montrée ci-dessous.

top - 04:24:03 up 96 days, 13:41,  1 user,  load average: 0.11, 0.14, 0.15
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  7.1%us,  0.2%sy,  0.0%ni, 88.4%id,  0.1%wa,  0.0%hi,  0.0%si,  4.2%st
Mem:   1011048k total,   950984k used,    60064k free,     9320k buffers
Swap:   524284k total,   113160k used,   411124k free,    96420k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P COMMAND
12426 nginx     20   0  345m  47m  29m S 77.6  4.8  40:24.92 7 php-fpm
 6685 mysql     20   0 3633m  34m 2932 S  4.3  3.5  63:12.91 4 mysqld
19014 root      20   0 15084 1188  856 R  1.3  0.1   0:01.20 4 top
    9 root      20   0     0    0    0 S  1.0  0.0 129:42.53 1 rcu_sched
 6349 memcache  20   0  355m  12m  224 S  0.3  1.2   9:34.82 6 memcached
    1 root      20   0 19404  212   36 S  0.0  0.0   0:20.64 3 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:30.02 4 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:12.45 0 ksoftirqd/0

la colonne P dans la sortie affiche le numéro du processeur où le processus est actuellement exécuté. En contrôlant cela pendant quelques minutes, vous comprendrez qu'un pid est en train de changer de cœur de processeur entre les deux. Vous pouvez également vérifier si votre pid pour lequel vous avez défini affinity tourne sur ce noyau particulier seulement

top f écran de navigation (exemple de système en direct) :

Fields Management for window 1:Def, whose current sort field is forest view
   Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
   'd' or <Space> toggles display, 's' sets sort.  Use 'q' or <Esc> to end!

* PID     = Process Id
* USER    = Effective User Name
* PR      = Priority
* NI      = Nice Value
* VIRT    = Virtual Image (KiB)
* RES     = Resident Size (KiB)
* SHR     = Shared Memory (KiB)
* S       = Process Status
* %CPU    = CPU Usage
* %MEM    = Memory Usage (RES)
* TIME+   = CPU Time, hundredths
* COMMAND = Command Name/Line
  PPID    = Parent Process pid
  UID     = Effective User Id
  RUID    = Real User Id
  RUSER   = Real User Name
  SUID    = Saved User Id
  SUSER   = Saved User Name
  GID     = Group Id
  GROUP   = Group Name
  PGRP    = Process Group Id
  TTY     = Controlling Tty
  TPGID   = Tty Process Grp Id
  SID     = Session Id
  nTH     = Number of Threads
* P       = Last Used Cpu (SMP)
  TIME    = CPU Time
  SWAP    = Swapped Size (KiB)
  CODE    = Code Size (KiB)
  DATA    = Data+Stack (KiB)
  nMaj    = Major Page Faults
  nMin    = Minor Page Faults
  nDRT    = Dirty Pages Count
  WCHAN   = Sleeping in Function
  Flags   = Task Flags <sched.h>
  CGROUPS = Control Groups
  SUPGIDS = Supp Groups IDs
  SUPGRPS = Supp Groups Names
  TGID    = Thread Group Id
  ENVIRON = Environment vars
  vMj     = Major Faults delta
  vMn     = Minor Faults delta
  USED    = Res+Swap Size (KiB)
  nsIPC   = IPC namespace Inode
  nsMNT   = MNT namespace Inode
  nsNET   = NET namespace Inode
  nsPID   = PID namespace Inode
  nsUSER  = USER namespace Inode
  nsUTS   = UTS namespace Inode
5
répondu Tarak nath Sinha 2016-10-21 12:47:10

réponse acceptée n'est pas exacte. Voici les moyens de savoir quel CPU exécute le thread (ou était le dernier à exécuter) au moment de l'enquête:

  1. lire directement /proc/<pid>/task/<tid>/stat . Avant de le faire, assurez-vous que le format n'a pas changé avec le dernier noyau. La Documentation n'est pas toujours à jour, mais au moins vous pouvez essayer https://www.kernel.org/doc/Documentation/filesystems/proc.txt . De cette écriture, il sera le 14e la valeur de la fin.
  2. utiliser ps . Soit vous donnez l'interrupteur -F , soit vous utilisez des modificateurs de sortie et ajoutez le code PSR .
  3. utiliser le haut avec la dernière colonne Cpu utilisée (en appuyant sur f vous amène à la sélection de la colonne)
  4. utilisez htop avec la colonne processeur (en appuyant sur F2 vous amène à l'écran de configuration)
0
répondu SergeyA 2017-12-27 20:16:46