Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何查看线程运行在哪个CPU内核中?_Linux_Linux Kernel_Scheduled Tasks_Scheduling_Scheduler - Fatal编程技术网

Linux 如何查看线程运行在哪个CPU内核中?

Linux 如何查看线程运行在哪个CPU内核中?,linux,linux-kernel,scheduled-tasks,scheduling,scheduler,Linux,Linux Kernel,Scheduled Tasks,Scheduling,Scheduler,在Linux中,假设线程的pid为[pid],我们可以从目录/proc/[pid]中获得许多有用的信息。例如,这些proc文件、/proc/[pid]/status、/proc/[pid]/stat和/proc/[pid]/schedstat都很有用。但是,如何获取线程运行的CPU核心号呢?如果一个线程处于睡眠状态,我如何知道在再次调度后它将运行哪个内核 顺便说一句,有没有办法转储每个CPU核心的运行和休眠任务的进程(线程)列表?以下答案从2014年起不再准确 任务不会在任何特定的核心中休眠。调

在Linux中,假设线程的pid为[pid],我们可以从目录/proc/[pid]中获得许多有用的信息。例如,这些proc文件、/proc/[pid]/status、/proc/[pid]/stat和/proc/[pid]/schedstat都很有用。但是,如何获取线程运行的CPU核心号呢?如果一个线程处于睡眠状态,我如何知道在再次调度后它将运行哪个内核

顺便说一句,有没有办法转储每个CPU核心的运行和休眠任务的进程(线程)列表?

以下答案从2014年起不再准确 任务不会在任何特定的核心中休眠。调度程序将不会提前知道它将在哪个内核上运行线程,因为这将取决于这些内核的未来使用情况

要获取所需信息,请查看/proc//task//status。如果线程正在运行,则第三个字段将是“R”。最后一个字段中的第六个将是线程当前运行的核心,或者是线程上次运行(或迁移到)的核心(如果当前未运行)

31466(bc)S31348 31466 31348 34819 31466 4202496 2557 0 0 5006 16 0 0 0 0 0 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264232056 21798807456 0 137912326 1844674407158622430 173

当前未运行。上次在core 3上运行

31466(bc)R31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0 0 0 0 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264231824 4235516 0 0 0 0 170 0 0 0 0 0 0 0 0 0 0 0 0

目前在Core2上运行

要了解其余字段的含义,请查看Linux内核源代码,特别是
fs/proc/array.c
或中的
do\u task\u stat
函数

请注意,在您获得这些信息时,这些信息可能都已过时。在您对proc中的文件进行
打开
调用和该调用返回之间的某个时间点上,这是正确的。

对于这一点,“top”命令可能会有所帮助,它没有CPU分组的线程列表,但您可以看到线程列表(可能是单个进程)以及线程运行的CPU内核

top-H-p{PROC_ID}


然后按f键进入字段选择,按j键启用CPU核心列,然后按Enter键显示。

您也可以使用
ps
,如下所示:

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

绑定一个特定的内核不需要线程(如果您没有固定它)。因此,要查看核心的连续切换,您可以使用(Dmitry的修改答案):

例如:

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

这可以通过
top
命令完成。默认的
top
命令输出不显示这些详细信息。要查看此详细信息,您必须在顶部命令界面上按f键,然后按j(按j后按Enter键)。现在,输出将向您显示有关进程及其运行的处理器的详细信息。下面显示了一个示例输出

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导航屏幕(实时系统示例): 窗口1:Def的字段管理,其当前排序字段为林视图 使用Up/Dn导航,右键选择移动然后或左键提交, “d”或切换显示,“s”设置排序。使用“q”或结束! *PID=进程Id *USER=有效用户名 *PR=优先级 *NI=好值 *VIRT=虚拟映像(KiB) *RES=居民人数(千磅) *SHR=共享内存(KiB) *S=过程状态 *%CPU=CPU使用率 *%MEM=内存使用率(RES) *时间+=CPU时间,百分之一百 *COMMAND=命令名/行 PPID=父进程pid UID=有效用户Id RUID=实际用户Id RUSER=真实用户名 SUID=保存的用户Id SUSER=保存的用户名 GID=组Id 组=组名 PGRP=进程组Id TTY=控制TTY TPGID=Tty进程组Id SID=会话Id n=线程数 *P=上次使用的Cpu(SMP) 时间=CPU时间 交换=交换大小(千磅) 代码=代码大小(KiB) 数据=数据+堆栈(KiB) nMaj=主要页面错误 nMin=小页面错误 nDRT=脏页计数 WCHAN=睡眠功能 标志=任务标志 CGROUPS=控制组 SUPGIDS=Supp组ID SUPGRPS=Supp组名称 TGID=线程组Id ENVIRON=环境变量 vMj=主要故障增量 vMn=小故障增量 使用=重置+交换大小(千磅) nsIPC=IPC名称空间索引节点 nsMNT=MNT命名空间索引节点 nsNET=NET名称空间索引节点 nsPID=PID命名空间索引节点 nsUSER=用户名称空间索引节点 nsUTS=UTS命名空间索引节点
接受的答案不准确。以下是查找查询时哪个CPU正在运行线程(或是最后一个运行的CPU)的方法:

  • 直接读取
    /proc//task//stat
    。在执行此操作之前,请确保格式不会随最新内核而更改。文档并非总是最新的,但至少您可以尝试一下。在撰写本文时,它将是从末尾算起的第14个值
  • 使用
    ps
    。要么给它一个
    -F
    开关,要么使用输出修饰符并添加code
    PSR
  • 对上次使用的Cpu列使用top(点击
    f
    进入列选择)
  • 将htop与处理器列一起使用(点击
    F2
    进入设置屏幕)

  • 考虑到SuffueServ.更好地获得ANSW的机会
    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
    
    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
    
    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 #