性能:如何检查特定 cpu 上的进程 运行
perf : How to check processess running on particular cpu
perf 中是否有任何选项可以查看特定 cpu / 核心上的进程 运行,以及每个进程占用该核心的百分比。
参考链接会很有帮助。
我知道 perf 不是正确的方法,尽管您可以限制每个 CPU perf
,如使用 perf record -C <cpulist>
甚至 perf stat -c <cpulist>
。
您将看到的关闭是 context-switch
事件,但是,这根本不会为您提供应用程序名称。
我认为您将需要更强大的功能,例如 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 提到的,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;
}
它跟踪进程在 CPU 上 运行 的时刻,并通过附加到 scheduler.cpu_on
和 scheduler.cpu_off
探测器停止执行(由于迁移或休眠)。第二个探测器计算这些事件之间的时间差,并将其与进程命令行参数一起保存到 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
perf 中是否有任何选项可以查看特定 cpu / 核心上的进程 运行,以及每个进程占用该核心的百分比。
参考链接会很有帮助。
我知道 perf 不是正确的方法,尽管您可以限制每个 CPU perf
,如使用 perf record -C <cpulist>
甚至 perf stat -c <cpulist>
。
您将看到的关闭是 context-switch
事件,但是,这根本不会为您提供应用程序名称。
我认为您将需要更强大的功能,例如 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 提到的,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;
}
它跟踪进程在 CPU 上 运行 的时刻,并通过附加到 scheduler.cpu_on
和 scheduler.cpu_off
探测器停止执行(由于迁移或休眠)。第二个探测器计算这些事件之间的时间差,并将其与进程命令行参数一起保存到 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