【问题标题】:How to get number of cores a program has executed on in Linux and CPU load如何获取程序在 Linux 中执行的内核数和 CPU 负载
【发布时间】:2014-11-04 09:05:47
【问题描述】:

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

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

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

【问题讨论】:

  • 也许该帖子可以提供一些帮助:stackoverflow.com/q/26362261/3194340 即使它是关于强制一个进程使用多个 CPU
  • @Cocoop 感谢您的评论。但是,我不能(也不想)改变我观察到的过程的亲和力。

标签: c linux multithreading


【解决方案1】:

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

我认为这回答了您的第一个问题(找出在您的流程执行期间发生了多少迁移)。

$ 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 我不知道如何追踪。

【讨论】:

  • 谢谢Emilien。除了通过系统调用之外,还有其他方法可以从 C 程序中调用 perf 吗?
【解决方案2】:

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

【讨论】:

  • 谢谢,我试试看。
猜你喜欢
  • 2011-02-25
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多