Linux 如何查看线程运行在哪个CPU内核中?
在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内核源代码,特别是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年起不再准确 任务不会在任何特定的核心中休眠。调
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
开关,要么使用输出修饰符并添加codePSR
对上次使用的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 #