fly*_*pen 47 linux scheduling scheduler scheduled-tasks linux-kernel
在Linux中,假设线程的pid是[pid],从目录/ proc/[pid]我们可以获得许多有用的信息.例如,这些proc文件,/ proc/[pid]/status,/ proc/[pid]/stat和/ proc/[pid]/schedstat都很有用.但是,如何获取运行线程的CPU核心编号?如果一个线程处于睡眠状态,我怎么知道它再次被调度后会运行哪个核心?
BTW,有没有办法为每个CPU核心转储运行和休眠任务的进程(线程)列表?
小智 36
"top"命令可能对此有所帮助,它没有CPU分组的线程列表,而是可以看到线程列表(可能是单个进程)以及线程运行的CPU内核
top -H -p {PROC_ID}
然后按f进入字段选择,j启用CPU核心列,并Enter显示.
Dav*_*rtz 31
任务不会在任何特定核心中休眠.并且调度程序将不会提前知道它将运行线程的核心,因为这将取决于这些核心的未来使用.
要获取所需信息,请查看/ proc/<pid>/task/<tid>/status.如果线程正在运行,第三个字段将是'R'.最后一个字段中的第六个字段将是当前运行的线程的核心,或者它最后运行的核心(或迁移到它的核心),如果它当前没有运行的话.
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
目前尚未运行.最后跑到核心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
目前正在核心2上运行.
要查看其余字段的含义,请查看Linux内核源代码 - 特别是do_task_stat
函数fs/proc/array.c
或Documentation/filesystems/stat.txt
.
请注意,所有这些信息在您获取时可能已过时.open
在proc中对文件进行调用和返回该调用之间的某个时刻确实如此.
Mon*_*nir 12
线程不必绑定一个特定的Core(如果你没有固定它).因此,要查看核心的连续切换,您可以使用(德米特里的修改后的答案):
watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep BINARY-NAME\`
Run Code Online (Sandbox Code Playgroud)
例如:
watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep firefox\`
Run Code Online (Sandbox Code Playgroud)
你也可以使用ps
这样的东西:
ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
Run Code Online (Sandbox Code Playgroud)
小智 7
这可以通过top
命令完成.默认top
命令输出不显示这些详细信息.要查看此详细信息,您必须f在顶部命令界面上按键,然后按j(按下Enter后按键j).现在,输出将显示有关进程及其运行的处理器的详细信息.示例输出如下所示.
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
Run Code Online (Sandbox Code Playgroud)
的P
在输出列显示其中当前正在执行的处理的处理器核心数.监视这几分钟将使您了解pid正在切换处理器核心.您还可以验证您已设置亲缘关系的pid是否仅在该特定核心上运行
top
f导航屏幕(实时系统示例):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
Run Code Online (Sandbox Code Playgroud)
接受的答案不准确。以下是在查询时找出哪个 CPU 正在运行线程(或最后一个运行)的方法:
/proc/<pid>/task/<tid>/stat
。在这样做之前,请确保格式没有随着最新的内核而改变。文档并不总是最新的,但至少您可以尝试https://www.kernel.org/doc/Documentation/filesystems/proc.txt。在撰写本文时,它将是从末尾算起的第 14 个值。ps
. 要么给它-F
开关,要么使用输出修饰符并添加代码PSR
。f
让您选择列)F2
让您进入设置屏幕) 归档时间: |
|
查看次数: |
79215 次 |
最近记录: |