如何查看线程在哪个 CPU 核心上运行?

2024-11-12 08:36:00
admin
原创
20
摘要:问题描述:在Linux中,假设一个线程的pid是[pid],从/proc/[pid]目录我们可以得到很多有用的信息。例如,这些proc文件,/proc/[pid]/status,/proc/[pid]/stat和/proc/[pid]/schedstat都是有用的。但是我如何才能得到一个线程正在运行的CPU核...

问题描述:

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

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


解决方案 1:

“top”命令可能对此有所帮助,它没有按 CPU 分组的线程列表,但您可以看到线程列表(可能是单个进程的)以及线程在哪个 CPU 核心上运行

top -H -p {PROC_ID}

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

解决方案 2:

以下答案自 2014 年起不再准确

任务不会在任何特定核心中休眠。调度程序不会提前知道将在哪个核心上运行线程,因为这取决于这些核心的未来使用情况。

要获取所需信息,请查看 /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 184467440737095516 15 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 中的文件进行调用和该调用返回之间的某个时刻,它是正确的。

解决方案 3:

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

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

解决方案 4:

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

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

例如:

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

解决方案 5:

这可以通过命令完成top。默认top命令输出不显示这些详细信息。要查看此详细信息,您必须f在顶部命令界面上按下 键,然后按jEnter按下 后按下 键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

输出中的列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

解决方案 6:

接受的答案并不准确。以下是找出查询时哪个 CPU 正在运行线程(或最后一个运行的线程)的方法:

  1. 直接读取/proc/<pid>/task/<tid>/stat。在执行此操作之前,请确保格式没有随最新内核而改变。文档并不总是最新的,但至少你可以尝试https://www.kernel.org/doc/Documentation/filesystems/proc.txt。截至撰写本文时,它将是从末尾开始的第 14 个值。

  2. 使用ps。要么给它-F开关,要么使用输出修饰符并添加代码PSR

  3. 使用顶部的 Last Used Cpu 列(点击f可进入列选择)

  4. 使用带有 PROCESSOR 列的 htop(点击F2可进入设置屏幕)

解决方案 7:

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 #
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用