如何查看正在运行线程的CPU核心?

时间:2011-11-07 03:12:18

标签: linux linux-kernel scheduled-tasks scheduling scheduler

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

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

7 个答案:

答案 0 :(得分:34)

“top”命令可能对此有所帮助,它没有CPU分组的线程列表,而是您可以看到线程列表(可能是单个进程)以及线程运行的CPU核心< / p>

top -H -p {PROC_ID}

然后按 f 进入字段选择, j 启用CPU核心列,< kbd> 输入 进行显示。

答案 1 :(得分:31)

截至2014年,以下答案不再准确

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

要获取所需信息,请查看/ proc /&lt; pid&gt; / task /&lt; tid&gt; / 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_statDocumentation/filesystems/stat.txt中的fs/proc/array.c函数。

请注意,所有这些信息在您获取时可能已过时。在proc中对文件进行open调用和返回该调用之间的某个时刻确实如此。

答案 2 :(得分:10)

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

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\`

答案 3 :(得分:9)

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

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

答案 4 :(得分:7)

可以使用 ctx.clearRect(0,0,W,H); ctx.save(); ctx.scale(10,10); this.array_length.forEach(function (x) { ctx.beginPath(); ctx.fillStyle = "blue"; ctx.fillRect(x.x, x.y, width, height); }); ctx.restore(); this.update(); 命令完成此操作。默认的top命令输出不显示这些详细信息。要查看此详细信息,您必须在顶部命令界面上按 f 键,然后按 j (按 j 后输入键。现在,输出将显示有关进程及其运行的处理器的详细信息。示例输出如下所示。

top

输出中的 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 列显示当前正在执行进程的处理器核心编号。监视这几分钟将使您了解pid正在切换处理器核心。您还可以验证您已设置亲缘关系的pid是否仅在该特定核心上运行

P f 导航界面(实时系统示例)

top

答案 5 :(得分:1)

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

  1. 直接阅读/proc/<pid>/task/<tid>/stat。在此之前,请确保格式没有随最新内核而改变。文档并不总是最新的,但至少可以尝试http://php.net/manual/en/function.fgetcsv.php。在撰写本文时,它将是最后的第14个值。
  2. 使用ps。要么给它-F切换,要么使用输出修饰符并添加代码PSR
  3. 使用top with Last Used Cpu列(点击f可以进行列选择)
  4. 使用带有PROCESSOR列的htop(点击F2可以进入设置屏幕)

答案 6 :(得分:0)

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 #