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

<p>в linux, предположим, что pid потока - это [pid], из каталога/proc/[pid] мы можем получить много полезной информации. например, эти файлы proc,/proc/[pid]/status,/proc/[pid]/stat и/proc/[pid]/schedstat являются полезными. но как я могу получить номер ядра цп, в котором запущен поток? если поток находится в состоянии сна, как я могу узнать, какое ядро будет запущено после повторного планирования?</p><p>кстати, есть ли способ вывести список процессов (потоков) запущенных и спящих задач для каждого ядра процессора?</p>

<h1>ответ ниже не является точным по состоянию на 2014 год</h1><p>задачи не спят ни в каком конкретном ядре. и планировщик не будет знать заранее, на каком ядре будет выполняться поток, потому что это будет зависеть от будущего использования этих ядер.</p><p>чтобы получить необходимую информацию, посмотрите в/proc/<pid>/task/<tid>/status. третье поле будет "r", если поток работает. шестым из последнего поля будет ядро, на котором в данный момент выполняется поток, или ядро, на котором он последний раз работал (или был перенесен), если он в данный момент не работает.</p><blockquote> <p>31466 (bc) <strong> [~ # ~] s [~ # ~] </strong> 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 <strong> 3 </strong> 0 0 0</p> </blockquote><p>в настоящее время не работает. последний работал на ядре 3.</p><blockquote> <p>31466 (bc) <strong> [~ # ~] r [~ # ~] </strong> 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 <strong> 2 </strong> 0 0 0 0 0</p> </blockquote><p>в настоящее время работает на ядре 2.</p><p>чтобы увидеть, что означают остальные поля, взгляните на исходный код ядра linux, в частности <code>do\_task\_stat</code> функция в <code>fs/proc/array.c</code> или <a href="http://www.kernel.org/doc/documentation/filesystems/proc.txt"><code>documentation/filesystems/stat.txt</code></a> .</p><p>обратите внимание, что вся эта информация может устареть к тому времени, когда вы ее получите. это было верно в некоторый момент между тем, когда вы сделали вызов <code>open</code> для файла в proc, и когда этот вызов вернулся.</p>

<p>команда top может помочь в этом, у нее нет списка потоков, сгруппированных по цп, но вы можете увидеть список потоков (вероятно, для одного процесса) и с какими ядрами цп работают потоки.</p><p><code>top -h -p {proc\_id}</code></p><p>затем нажав <kbd><b>е</b></kbd> перейти к выбору поля, <kbd><b>j</b></kbd> чтобы включить столбец ядра процессора, и <kbd><b>войти</b></kbd> для отображения.</p>

<p>потоки не обязательны для привязки одного конкретного ядра (если вы его не закрепили). поэтому, чтобы увидеть непрерывное переключение ядра, вы можете использовать (модифицированный ответ дмитрия):</p><pre><code>watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep binary-name\` </code></pre><p>например:</p><pre><code>watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep firefox\` </code></pre>

<p>вы также можете использовать <code>ps</code>, что-то вроде этого:</p><pre><code>ps -mo pid,tid,%cpu,psr -p `pgrep binary-name` </code></pre>

<p>это можно сделать с помощью команды <strong><code>top</code></strong>. вывод команды <code>top</code> по умолчанию не отображает эти детали. для просмотра этой детали вам нужно нажать <kbd><strong>f</strong></kbd> ключ в верхнем командном интерфейсе, а затем нажмите <kbd><strong>j</strong></kbd>(нажмите <kbd>enter</kbd> ключ после того, как вы нажали <kbd>j</kbd>). теперь выходные данные покажут вам детали относительно процесса и какого процессора он работает. пример вывода показан ниже.</p><pre><code>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 </code></pre><p>столбец <strong><code>p</code></strong> в выходных данных показывает номер ядра процессора, в котором в данный момент выполняется процесс. отслеживая это в течение нескольких минут, вы поймете, что pid переключает ядра процессора между ними. вы также можете проверить, работает ли ваш pid, для которого вы установили сходство, только на этом конкретном ядре.</p><h2><code>top</code> <kbd>f</kbd> экран навигации <sup>(пример живой системы)</sup> :</h2><pre><code>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 </code></pre>

<p>принятый ответ не является точным. вот способы узнать, на каком процессоре запущен поток (или он был запущен последним) на момент запроса:</p><ol> <li>напрямую читайте <code>/proc/<pid>/task/<tid>/stat</code>. перед этим убедитесь, что формат не изменился в последнем ядре. документация не всегда актуальна, но, по крайней мере, вы можете попробовать <a href="https://www.kernel.org/doc/documentation/filesystems/proc.txt">https://www.kernel.org/doc/documentation/filesystems/proc.txt</a> . на момент написания статьи это будет 14-е значение с конца.</li> <li>используйте <code>ps</code>. либо дайте это <code>-f</code> или используйте модификаторы вывода и добавьте код <code>psr</code>.</li> <li>используйте top с последним использованным столбцом процессора (нажатие <code>f</code> приведет вас к выбору столбца)</li> <li>используйте htop с колонкой processor (нажав <code>f2</code> возвращает вас к экрану настройки)</li> </ol>

<pre><code>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 # </code></pre>