2014-11-04 52 views
1

我需要找出在一定时间内(例如1秒左右),给定进程执行了多少个CPU内核? 这必须从C程序(或可能C++)完成。我知道perf的数量是cpu-migrations如何获得一个程序在Linux和CPU负载下执行的内核数量

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

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

+0

也许有人指出,这篇文章可以帮助:http://stackoverflow.com/q/26362261/3194340即使这是关于迫使一些CPU的过程 – Coconop 2014-11-04 09:33:37

+0

@Coconop感谢您的评论。但是,我不能(也不愿意)改变我观察到的过程的亲和力。 – Curious 2014-11-04 09:38:43

回答

1

我没有明确的答案,但这里是我发现的。我使用压力-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,我不知道如何追查。

+0

谢谢艾米利安。除了通过系统调用之外,有没有办法从C程序中调用perf? – Curious 2014-11-04 11:49:34

0

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

+0

谢谢,我会试一试。 – Curious 2014-11-04 21:54:54

相关问题