¿Cómo puedo ver en qué núcleo de CPU se está ejecutando un subproceso?


En Linux, suponiendo que el pid de un hilo es [pid], desde el directorio /proc/[pid] podemos obtener mucha información útil. Por ejemplo, estos archivos proc, /proc/[pid]/status/proc/[pid]/stat y /proc/[pid]/schedstat son todos útiles. Pero, ¿cómo puedo obtener el número de núcleo de la CPU en el que se está ejecutando un subproceso? Si un hilo está en estado de reposo, ¿cómo puedo saber qué núcleo se ejecutará después de que se programe de nuevo?

Por cierto, ¿hay una manera de volcar la lista de procesos (subprocesos) de tareas en ejecución y en reposo para cada ¿Núcleo de la CPU?

Author: flypen, 2011-11-07

6 answers

La respuesta a continuación ya no es precisa a partir de 2014

Las tareas no duermen en ningún núcleo en particular. Y el programador no sabrá de antemano en qué núcleo ejecutará un subproceso porque eso dependerá del uso futuro de esos núcleos.

Para obtener la información que desea, busque en /proc//task//status. El tercer campo será una 'R' si el hilo se está ejecutando. El sexto del último campo será el núcleo en el que se está ejecutando actualmente el subproceso, o el núcleo en el que se ejecutó por última vez (o se migró a) si no se está ejecutando actualmente.

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 140737264235072 140737264232056 217976807456 0 0 0 137912326 18446744071581662243 0 0 17 3 0 0 0 0 0

No se está ejecutando actualmente. Última corrida en el núcleo 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 140737264235072 140737264231824 4235516 0 0 0 2 0 0 0 17 2 0 0 0 0 0

Actualmente en ejecución en el núcleo 2.

Para ver lo que significan el resto de los campos, eche un vistazo a la fuente del kernel de Linux specifically específicamente la función do_task_stat en fs/proc/array.c o Documentation/filesystems/stat.txt.

Tenga en cuenta que toda esta información puede ser obsoleta en el momento en que la obtenga. Fue cierto en algún momento entre cuando hizo el open llame al archivo en proc y cuándo regresó esa llamada.

 30
Author: David Schwartz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 20:06:56

El comando " top " puede ayudar en esto, no tiene una lista de subprocesos agrupada por CPU, sino que puede ver la lista de subprocesos (probablemente para un solo proceso) y en qué núcleos de CPU se ejecutan los subprocesos

top -H -p {PROC_ID}

Luego presionando f para entrar en la selección de campo, j para habilitar la columna CPU core, y Entrar para mostrar.

 33
Author: maltanar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-21 08:45:43

Los hilos no son necesarios para enlazada Core (si no el pin). Por lo tanto para ver el cambio continuo del núcleo se puede utilizar (una respuesta modificada de Dmitry):

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

Por ejemplo:

watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep firefox\`
 8
Author: Monir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-15 16:55:25

También puedes usar ps, algo así:

ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
 7
Author: Dmitry Vyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-21 08:44:20

Esto se puede hacer con top comando. La salida predeterminada del comando top no muestra estos detalles. Para ver este detalle tendrás que pulsar f tecla mientras está en la interfaz de comando superior y luego presione j(presione Enterdespués de presionar j). Ahora la salida le mostrará los detalles con respecto a un proceso y qué procesador se está ejecutando. A continuación se muestra una salida de muestra.

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

El P columna en la salida muestra el número de núcleo del procesador donde se está ejecutando el proceso. Monitorear esto durante unos minutos le hará comprender que un pid está cambiando los núcleos del procesador en el medio. También puede verificar si su pid para el que ha establecido afinidad se está ejecutando solo en ese núcleo en particular

top f pantalla de navegación (un ejemplo de sistema en vivo) :

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
Author: Tarak nath Sinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-21 12:47:10

La respuesta aceptada no es exacta. Estas son las formas de averiguar qué CPU está ejecutando el subproceso (o fue la última en ejecutarse) en el momento de la consulta:

  1. Lea directamente /proc/<pid>/task/<tid>/stat. Antes de hacerlo, asegúrese de que el formato no haya cambiado con el kernel más reciente. La documentación no siempre está actualizada, pero al menos puedes probar https://www.kernel.org/doc/Documentation/filesystems/proc.txt . A partir de este escrito, será el valor 14 desde el final.
  2. Use ps. Ya sea dar it -F cambia, o usa modificadores de salida y agrega código PSR.
  3. Use la parte superior con la Última columna de Cpu utilizada (al golpear f se obtiene la selección de columnas)
  4. Use htop con la columna PROCESADOR (golpear F2 le lleva a la pantalla de configuración)
 0
Author: SergeyA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 20:16:46