Linux 性能:如何检查在特定cpu上运行的进程

Linux 性能:如何检查在特定cpu上运行的进程,linux,linux-kernel,perf,Linux,Linux Kernel,Perf,perf中是否有任何选项可以查看在特定cpu/内核上运行的进程,以及每个进程占用该内核的百分比 参考链接会很有帮助。我知道perf不是正确的方法,尽管您可以使用perf record-C甚至perf stat-C来限制每个CPU的perf 您将看到的结束是上下文切换事件,但是,这根本不会为您提供应用程序名称 我认为您将需要更强大的功能,如systemtap。我理解性能不是正确的方法,尽管您可以限制每个CPU的性能,如使用perf record-C甚至perf stat-C 您将看到的结束是上下文

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


参考链接会很有帮助。

我知道perf不是正确的方法,尽管您可以使用
perf record-C
甚至
perf stat-C
来限制每个CPU的
perf

您将看到的结束是
上下文切换
事件,但是,这根本不会为您提供应用程序名称


我认为您将需要更强大的功能,如systemtap。

我理解性能不是正确的方法,尽管您可以限制每个CPU的性能,如使用
perf record-C
甚至
perf stat-C

您将看到的结束是
上下文切换
事件,但是,这根本不会为您提供应用程序名称


我认为您将需要更强大的功能,因为systemtap。

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所提到的,它对您的脚本非常有用。这是您的任务脚本

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;
}

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所提到的,它对您的脚本非常有用。这是您的任务脚本

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;
}
我试过:perf top-C,它在cpu上给出内核函数的百分比。我试过:perf top-C,它在cpu上给出内核函数的百分比。