64

In Linux, supposing a thread's pid is [pid], from the directory /proc/[pid] we can get many useful information. For example, these proc files, /proc/[pid]/status,/proc/[pid]/stat and /proc/[pid]/schedstat are all useful. But how can I get the CPU core number that a thread is running in? If a thread is in sleep state, how can I know which core it will run after it is scheduled again?

BTW, is there a way to dump the process(thread) list of running and sleeping tasks for each CPU core?

3
  • 2
    consider moving to superuser.com - better chances of getting an answer there. Commented Nov 7, 2011 at 3:19
  • @ringbearer, This can be a Linux programming question too. Commented May 12, 2016 at 10:12
  • 7
    If you got here because you want to do this from within C, the CPU of the caller can be gotten using sched_getcpu(). Commented Jun 26, 2020 at 19:45

7 Answers 7

55

The "top" command may help towards this, it does not have CPU-grouped list of threads but rather you can see the list of threads (probably for a single process) and which CPU cores the threads are running on by

top -H -p {PROC_ID}

then pressing f to go into field selection, j to enable the CPU core column, and Enter to display.

Sign up to request clarification or add additional context in comments.

Comments

34

The answer below is no longer accurate as of 2014

Tasks don't sleep in any particular core. And the scheduler won't know ahead of time which core it will run a thread on because that will depend on future usage of those cores.

To get the information you want, look in /proc/<pid>/task/<tid>/status. The third field will be an 'R' if the thread is running. The sixth from the last field will be the core the thread is currently running on, or the core it last ran on (or was migrated to) if it's not currently running.

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

Not currently running. Last ran on core 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

Currently running on core 2.

To see what the rest of the fields mean, have a look at the Linux kernel source -- specifically the do_task_stat function in fs/proc/array.c or Documentation/filesystems/stat.txt.

Note that all of this information may be obsolete by the time you get it. It was true at some point between when you made the open call on the file in proc and when that call returned.

[Currently 2025, 5.4.0 kernel]

This information has moved to the 'stat' file.
Running vs Sleeping is still an R or S at field #3
Processor Core is in the 39th field

awk '{print $3," ",$39}' /proc/<pid>/task/<tid>/stat 

2 Comments

Thanks for your quick reply. I have another question: stackoverflow.com/questions/7849353/…. If I pin my thread to a dedicated core, then everything is OK. This is why I want to know the answer of this question.
This answer was posted on 2011. In 2014, this status file is not using this format anymore, see other answers
22

You can also use ps, something like this:

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

1 Comment

Sadly doesn't work with the Busybox version of ps.
19

The threads are not necessary to bound one particular Core (if you did not pin it). Therefore to see the continuous switching of the core you can use (a modified answer of Dmitry):

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

For example:

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

Comments

18

This can be done with top command. The default top command output does not show these details. To view this detail you will have to press f key while on top command interface and then press j(press Enter key after you pressed j). Now the output will show you details regarding a process and which processor its running. A sample output is shown below.

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 

The P column in the output shows the processor core number where the process is currently being executed. Monitoring this for a few minutes will make you understand that a pid is switching processor cores in between. You can also verify whether your pid for which you have set affinity is running on that particular core only

top f navigation screen ( a live system example ) :

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 

Comments

9

Accepted answer is not accurate. Here are the ways to find out which CPU is running the thread (or was the last one to run) at the moment of inquiry:

  1. Directly read /proc/<pid>/task/<tid>/stat. Before doing so, make sure format didn't change with latest kernel. Documentation is not always up to date, but at least you can try https://www.kernel.org/doc/Documentation/filesystems/proc.txt. As of this writing, it will be the 14th value from the end.
  2. Use ps. Either give it -F switch, or use output modifiers and add code PSR.
  3. Use top with Last Used Cpu column (hitting f gets you to column selection)
  4. Use htop with PROCESSOR column (hitting F2 gets you to setup screen)

Comments

3
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 # 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.