Как я могу увидеть, в каком ядре процессора работает поток?

В Linux, предполагая, что поток pid является [pid], из каталога /proc/ [pid] мы можем получить много полезной информации. Например, эти файлы proc/proc/[pid]/status,/proc/[pid]/stat и /proc/ [pid]/schedstat полезны. Но как я могу получить номер ядра процессора, в котором работает поток? Если поток находится в состоянии ожидания, как я могу узнать, какое ядро ​​будет запущено после его повторного планирования?

Кстати, есть ли способ сбросить список процессов (задач) для запуска и спящего режима для каждого ядра ЦП?

Ответ 1

Нижеприведенный ответ более не точен с 2014 года

Задачи не спят в каком-либо конкретном ядре. И планировщик не знает заранее, в каком ядре он будет запускать поток, потому что это будет зависеть от будущего использования этих ядер.

Чтобы получить нужную информацию, просмотрите /proc/ <pid> /task/<tid> /status. Третье поле будет "R", если поток запущен. Шестой из последнего поля будет ядром, в котором выполняется текущий поток, или ядром, на котором он в последний раз выполнялся (или был перенесен на), если он в настоящее время не работает.

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

Не работает. Последняя работала на ядре 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

В настоящее время работает на ядре 2.

Чтобы узнать, что означают остальные поля, посмотрите на источник ядра Linux - в частности, функцию do_task_stat в fs/proc/array.c или Documentation/filesystems/stat.txt.

Обратите внимание, что вся эта информация может быть устаревшей к моменту ее получения. Это было верно в какой-то момент между тем, когда вы сделали вызов open в файле в proc и когда этот вызов вернулся.

Ответ 2

Команда "top" может помочь в этом, у нее нет списка потоков с разбивкой по группам процессоров, но вы можете увидеть список потоков (возможно, для одного процесса) и какой процессор запустил потоки на

top -H -p {PROC_ID}

затем нажмите f, чтобы перейти к выбору поля, j, чтобы включить колонку ядра ЦП, и Enter.

Ответ 3

Нити не нужны для привязки одного конкретного ядра (если вы его не зацепили). Поэтому для просмотра непрерывного переключения ядра вы можете использовать (измененный ответ Дмитрия):

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

Например:

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

Ответ 4

Вы также можете использовать ps, что-то вроде этого:

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

Ответ 5

Это можно сделать с помощью команды top. Вывод команды top по умолчанию не отображает эти данные. Чтобы просмотреть эту информацию, вам нужно нажать клавишу f во время верхнего командного интерфейса, а затем нажмите j (нажмите клавишу Enter после нажатия j). Теперь на выходе будет отображаться подробная информация о процессе и о том, какой процессор работает. Пример вывода показан ниже.

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

Столбец P на выходе показывает номер ядра процессора, в котором выполняется данный процесс. Наблюдая за этим в течение нескольких минут, вы поймете, что pid переключает процессорные ядра между ними. Вы также можете проверить, работает ли ваш pid, для которого вы установили близость, только на этом конкретном ядре

top f экран навигации (пример в реальном времени):

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

Ответ 6

Принятый ответ неверен. Ниже приведены способы узнать, какой процессор использует поток (или был последним для запуска) в момент запроса:

  • Непосредственно прочитайте /proc/<pid>/task/<tid>/stat. Прежде чем делать это, убедитесь, что формат не изменился с последним ядром. Документация не всегда актуальна, но по крайней мере вы можете попробовать https://www.kernel.org/doc/Documentation/filesystems/proc.txt. На момент написания этой статьи это будет 14-е значение с конца.
  • Используйте ps. Либо дайте ему -F переключатель, либо используйте выходные модификаторы и добавьте код PSR.
  • Используйте верхний столбец Last Used Cpu (нажатие f позволяет выбрать столбцы)
  • Использование htop с колонкой PROCESSOR (нажатие F2 позволяет вам настроить экран)

Ответ 7

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 #