【问题标题】:perf : How to check processess running on particular cpuperf:如何检查在特定 cpu 上运行的进程
【发布时间】:2015-05-12 13:10:00
【问题描述】:

perf 中是否有任何选项可以查看在特定 cpu /core 上运行的进程,以及每个进程占用该核心的百分比。

参考链接会很有帮助。

【问题讨论】:

  • 我试过:perf top -C ,它以百分比的形式在 cpu 上提供内核函数。

标签: linux linux-kernel perf


【解决方案1】:

perf 旨在进行不适合您的情况的分析。您可以尝试采样/proc/sched_debug(如果它在您的内核中编译)。例如,您可以检查 CPU 上当前正在运行的进程:

egrep '^R|cpu#' /proc/sched_debug 
cpu#0, 917.276 MHz
R          egrep  2614     37730.177313 ...
cpu#1, 917.276 MHz
R           bash  2023    218715.010833 ...

通过使用他的 PID 作为键,您可以检查它消耗了多少 CPU 时间(以毫秒为单位):

grep se.sum_exec_runtime /proc/2023/sched
se.sum_exec_runtime                          :        279346.058986

但是,正如@BrenoLeitão 所提到的,SystemTap 对您的脚本非常有用。这是您的任务的脚本。

global cputimes;
global cmdline;
global oncpu;

global NS_PER_SEC = 1000000000;

probe scheduler.cpu_on {
    oncpu[pid()] = local_clock_ns();
}

probe scheduler.cpu_off {
    if(oncpu[pid()] == 0)
        next;

    cmdline[pid()] = cmdline_str();
    cputimes[pid(), cpu()] <<< local_clock_ns() - oncpu[pid()];

    delete oncpu[pid()];
}

probe timer.s(1) {
    printf("%6s %3s %6s %s\n", "PID", "CPU", "PCT", "CMDLINE");
    foreach([pid+, cpu] in cputimes) {
        cpupct = @sum(cputimes[pid, cpu]) * 10000 / NS_PER_SEC;

        printf("%6d %3d %3d.%02d %s\n", pid, cpu, 
            cpupct / 100, cpupct % 100, cmdline[pid]);
    }

    delete cputimes;
}

它通过附加到scheduler.cpu_onscheduler.cpu_off 探针来跟踪进程在CPU 上运行并停止执行(由于迁移或休眠)的时刻。第二个探针计算这些事件之间的时间差,并将其与进程命令行参数一起保存到 cputimes 聚合中。

timer.s(1) 每秒触发一次——它遍历聚合并计算百分比。这是 Centos 7 的示例输出,bash 运行无限循环:

     0   0 100.16 
    30   1   0.00 
    51   0   0.00 
   380   0   0.02 /usr/bin/python -Es /usr/sbin/tuned -l -P
  2016   0   0.08 sshd: root@pts/0 "" "" "" ""
  2023   1 100.11 -bash
  2630   0   0.04 /usr/libexec/systemtap/stapio -R stap_3020c9e7ba76838179be68cd2390a10c_2630 -F3

【讨论】:

    【解决方案2】:

    我知道 perf 不是正确的方法,尽管您可以限制每个 CPU 的 perf,如使用 perf record -C &lt;cpulist&gt; 甚至 perf stat -c &lt;cpulist&gt;

    您将看到的关闭是context-switch 事件,但是,这根本不会为您提供应用程序名称。

    我认为您将需要更强大的东西,例如 systemtap。

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多