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?
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/
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é.
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.
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\`
vous pouvez aussi utiliser ps
, quelque chose comme ceci:
ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
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
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:
- 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. - utiliser
ps
. Soit vous donnez l'interrupteur-F
, soit vous utilisez des modificateurs de sortie et ajoutez le codePSR
. - utiliser le haut avec la dernière colonne Cpu utilisée (en appuyant sur
f
vous amène à la sélection de la colonne) - utilisez htop avec la colonne processeur (en appuyant sur
F2
vous amène à l'écran de configuration)