it-swarm.com.ru

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

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

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

46
flypen

Ответ ниже не является точным по состоянию на 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

В настоящее время не работает. Последний работал на ядре 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, и когда этот вызов вернулся.

31
David Schwartz

Команда top может помочь в этом, у нее нет списка потоков, сгруппированных по ЦП, но вы можете увидеть список потоков (вероятно, для одного процесса) и с какими ядрами ЦП работают потоки.

top -H -p {PROC_ID}

затем нажав е перейти к выбору поля, j чтобы включить столбец ядра процессора, и Войти для отображения.

34
maltanar

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

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\`
12
Monir

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

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

Это можно сделать с помощью команды 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
7
Tarak nath Sinha

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

  1. Напрямую читайте /proc/<pid>/task/<tid>/stat. Перед этим убедитесь, что формат не изменился в последнем ядре. Документация не всегда актуальна, но, по крайней мере, вы можете попробовать https://www.kernel.org/doc/Documentation/filesystems/proc.txt . На момент написания статьи это будет 14-е значение с конца.
  2. Используйте ps. Либо дайте это -F или используйте модификаторы вывода и добавьте код PSR.
  3. Используйте top с последним использованным столбцом процессора (нажатие f приведет вас к выбору столбца)
  4. Используйте htop с колонкой PROCESSOR (нажав F2 возвращает вас к экрану настройки)
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