How can I see which CPU core a thread is running in?

前端 未结 7 1220
悲&欢浪女
悲&欢浪女 2020-12-07 14:09

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

相关标签:
7条回答
  • 2020-12-07 14:23

    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
    
    0 讨论(0)
  • 2020-12-07 14:24

    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\`
    
    0 讨论(0)
  • 2020-12-07 14:27

    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)
    0 讨论(0)
  • 2020-12-07 14:28

    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.

    0 讨论(0)
  • 2020-12-07 14:40
    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 讨论(0)
  • 2020-12-07 14:46

    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.

    0 讨论(0)
提交回复
热议问题