web-dev-qa-db-fra.com

Comment puis-je voir dans quel cœur de 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]/status,/proc/[pid]/stat et/proc/[pid]/schedstat sont tous utiles. Mais comment puis-je obtenir le numéro de cœur du processeur dans lequel un thread s'exécute? Si un thread est en veille, comment puis-je savoir quel noyau il s'exécutera après avoir été planifié à nouveau?

BTW, existe-t-il un moyen de vider la liste de processus (thread) des tâches en cours d'exécution et de sommeil pour chaque cœur de processeur?

46
flypen

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

Les tâches ne dorment pas dans un noyau particulier. Et le planificateur ne saura pas à l'avance sur quel cœur il exécutera un thread, car cela dépendra de l'utilisation future de ces cœurs.

Pour obtenir les informations souhaitées, regardez dans/proc/<pid>/task/<tid>/status. Le troisième champ sera un "R" si le thread est en cours d'exécution. Le sixième du dernier champ sera le noyau sur lequel le thread s'exécute actuellement, ou le noyau sur lequel il a été exécuté en dernier (ou a été migré) s'il n'est pas en cours d'exécution.

31466 (bc) [~ # ~] 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 1407372642350722056 217976807456 0 0 0 137912326 18446744071581662243 0 0 17 3 0 0 0 0 0

Pas en cours d'exécution. Dernière exécution sur le core 3.

31466 (bc) [~ # ~] 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 140737264235023 14024 4235516 0 0 0 2 0 0 0 17 2 0 0 0 0 0

Actuellement en cours d'exécution sur le noyau 2.

Pour voir ce que signifient les autres champs, jetez un œil à la source du noyau Linux - en particulier le do_task_stat fonction dans fs/proc/array.c ou Documentation/filesystems/stat.txt .

Notez que toutes ces informations peuvent être obsolètes au moment où vous les obtenez. C'était vrai à un moment donné entre le moment où vous avez fait l'appel open sur le fichier dans proc et le moment où cet appel est revenu.

31
David Schwartz

La commande "top" peut aider à cela, elle n'a pas de liste de threads regroupés par CPU mais vous pouvez plutôt voir la liste des threads (probablement pour un seul processus) et les cœurs de CPU par lesquels les threads s'exécutent.

top -H -p {PROC_ID}

puis en appuyant sur f pour aller dans la sélection des champs, j pour activer la colonne du cœur du processeur, et Entrer afficher.

34
maltanar

Les threads ne sont pas nécessaires pour lier un Core particulier (si vous ne l'avez pas épinglé). Par conséquent, pour voir la commutation continue du noyau, 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\`
12
Monir

Vous pouvez également utiliser ps, quelque chose comme ceci:

ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
9
Dmitry Vyal

Cela peut être fait avec la commande top. La sortie de commande par défaut top ne montre pas ces détails. Pour voir ce détail, vous devrez appuyer sur f sur l'interface de commande supérieure, puis appuyez sur j(presse Enter après avoir appuyé sur la touche j). Maintenant, la sortie vous montrera les détails concernant un processus et le processeur qu'il exécute. Un exemple de sortie est illustré 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 de cœur du processeur où le processus est en cours d'exécution. La surveillance de cela pendant quelques minutes vous fera comprendre qu'un pid commute les cœurs de processeur entre les deux. Vous pouvez également vérifier si votre pid pour lequel vous avez défini l'affinité fonctionne uniquement sur ce noyau particulier

top f écran de navigation (un 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
7
Tarak nath Sinha

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

  1. Lisez 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 . Au moment de la rédaction de ce document, ce sera la 14e valeur à partir de la fin.
  2. Utilisez ps. Soit lui donner -F changez, ou utilisez des modificateurs de sortie et ajoutez le code PSR.
  3. Utiliser le haut avec la dernière colonne du processeur utilisé (en appuyant sur f, vous accédez à la sélection de colonne)
  4. Utilisez htop avec la colonne PROCESSOR (en appuyant sur F2 vous amène à l'écran de configuration)
2
SergeyA
To see the threads of a process :

ps -T -p PID

To see the thread run info

ps -mo pid,tid,%cpu,psr -p PID

Example :

/tmp # ps -T -p 3725
  PID  SPID TTY          TIME CMD
 3725  3725 ?        00:00:00 Apps
 3725  3732 ?        00:00:10 t9xz1d920
 3725  3738 ?        00:00:00 XTimer
 3725  3739 ?        00:00:05 Japps
 3725  4017 ?        00:00:00 QTask
 3725  4024 ?        00:00:00 Kapps
 3725  4025 ?        00:00:17 PTimer
 3725  4026 ?        00:01:17 PTask
 3725  4027 ?        00:00:00 RTask
 3725  4028 ?        00:00:00 Recv
 3725  4029 ?        00:00:00 QTimer
 3725  4033 ?        00:00:01 STask
 3725  4034 ?        00:00:02 XTask
 3725  4035 ?        00:00:01 QTimer
 3725  4036 ?        00:00:00 RTimer
 3725  4145 ?        00:00:00 t9xz1d920
 3725  4147 ?        00:00:02 t9xz1d920
 3725  4148 ?        00:00:00 t9xz1d920
 3725  4149 ?        00:00:00 t9xz1d920
 3725  4150 ?        00:00:00 t9xz1d920
 3725  4865 ?        00:00:02 STimer

/tmp #
/tmp #
/tmp # ps -mo pid,tid,%cpu,psr -p 3725
  PID   TID %CPU PSR
 3725     -  1.1   -
    -  3725  0.0   2
    -  3732  0.1   0
    -  3738  0.0   0
    -  3739  0.0   0
    -  4017  0.0   6
    -  4024  0.0   3
    -  4025  0.1   0
    -  4026  0.7   0
    -  4027  0.0   3
    -  4028  0.0   7
    -  4029  0.0   0
    -  4033  0.0   4
    -  4034  0.0   1
    -  4035  0.0   0
    -  4036  0.0   2
    -  4145  0.0   2
    -  4147  0.0   0
    -  4148  0.0   5
    -  4149  0.0   2
    -  4150  0.0   7
    -  4865  0.0   0
/tmp #
0
devOgopan