如何获取程序在Linux和CPU负载中执行的核心数

时间:2014-11-04 09:05:47

标签: c linux multithreading

我需要找出特定时间内执行的CPU核心数量,例如1秒左右? 这必须从C程序(或可能是C ++)完成。我知道perf表示cpu-migrations的数量。

我需要知道CPU核心交换的数量以及该进程使用的核心。 我假设我首先必须获取进程执行的线程,然后查看线程运行的内核。

我得到的信息用于计算进程的CPU负载。当只在一个CPU核心中运行时,我知道该怎么做并且有一个可行的解决方案。但是,处理多个CPU内核时,由多个线程组成的进程在不同时间在一个或多个CPU内核中运行会使其变得更难。有没有解决方案或提示可以解决任何人可以指出的问题?

2 个答案:

答案 0 :(得分:1)

我没有明确的答案,但这是我发现的。我使用stress -c 1 -t 1(在一秒钟内运行一个sqrt +循环过程)。

我认为这可以回答您的第一个问题(了解在执行流程期间发生的迁移次数)。

$ perf stat -e migrations stress -c 1 -t 1
stress: info: [4159] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [4159] successful run completed in 1s
 Performance counter stats for 'stress -c 1 -t 1':
                 2      migrations

接下来我发现了一个有趣的跟踪点:

perf stat -e sched:sched_migrate_task stress -c 1 -t 1

并且它发生sched_migrate_task has a dest_cpu argument,我不知道如何追踪。

答案 1 :(得分:0)

试用kernelshark工具。它提供了更好的多核系统可视化表示,亲和力以及可以帮助收集信息的更多功能。