如何查看线程在哪个CPU内核中运行? [英] How can I see which CPU core a thread is running in?

查看:590
本文介绍了如何查看线程在哪个CPU内核中运行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In Linux, supposing a thread's pid is [pid], from the directory /proc/[pid] we can get many useful information. For example, these proc files, /proc/[pid]/status,/proc/[pid]/stat and /proc/[pid]/schedstat are all useful. But how can I get the CPU core number that a thread is running in? If a thread is in sleep state, how can I know which core it will run after it is scheduled again?

顺便说一句,有没有一种方法可以转储每个CPU内核的正在运行和正在休眠的任务的进程(线程)列表?

BTW, is there a way to dump the process(thread) list of running and sleeping tasks for each CPU core?

推荐答案

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

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

The answer below is no longer accurate as of 2014

Tasks don't sleep in any particular core. And the scheduler won't know ahead of time which core it will run a thread on because that will depend on future usage of those cores.

要获取所需的信息,请查看/proc/< pid>/task/< tid>/status.如果线程正在运行,则第三个字段将为"R".最后一个字段的第六个将是线程当前正在运行的核心,或者如果线程当前未在运行,则它将最后运行(或已迁移到)该核心.

To get the information you want, look in /proc/<pid>/task/<tid>/status. The third field will be an 'R' if the thread is running. The sixth from the last field will be the core the thread is currently running on, or the core it last ran on (or was migrated to) if it's not currently running.

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 3 0 0 0 0 0

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.

Not currently running. Last ran on core 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

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内核源代码-尤其是fs/proc/array.cdo_task_stat函数. /Documentation/filesystems/proc.txt"rel =" nofollow noreferrer> Documentation/filesystems/stat.txt .

To see what the rest of the fields mean, have a look at the Linux kernel source -- specifically the do_task_stat function in fs/proc/array.c or Documentation/filesystems/stat.txt.

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

Note that all of this information may be obsolete by the time you get it. It was true at some point between when you made the open call on the file in proc and when that call returned.

这篇关于如何查看线程在哪个CPU内核中运行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆