perf:软件事件之间的奇怪关系

好吧,所以这真的让我感到困扰。

我使用perf来loggingcpu-clock事件(一个软件事件):

$ > perf record -e cpu-clock srun -n 1 ./stream 

…和perf报表生成的表是空的。

我正在使用perf来loggingperf列表中列出的所有可用软件事件:

 $ > perf record -e alignment-faults,context-switches,cpu-clock,cpu-migrations,\ dummy,emulation-faults,major-faults,minor-faults,page-faults,task-clock\ srun -n 1 ./stream 

…表格给了我一个可用的样品清单:

 0 alignment-faults 125 context-switches 255 cpu-clock 21 cpu-migrations 0 dummy 0 emulation-faults 0 major-faults 128 minor-faults 132 page-faults 254 task-clock 

我可以看看在CPU时钟收集的样品,它给我的信息。 为什么?! 如果我只测量cpu时钟,为什么不行? 为什么四个事件中没有收集样本?

这是这个问题的后续: 错误:perf.data文件没有样本

Solutions Collecting From Web of "perf:软件事件之间的奇怪关系"

可能srun不用直接叉开始目标进程。 它可以使用一些像ssh或daemon这样的远程shell来启动进程。

perf record (没有-a选项)将仅跟踪直接分叉的子进程,而不是由sshd或其他守护进程启动(分叉)的进程。 而且,如果srun可以访问它并且使用了perf record ... srun命令(这是配置srun应用程序及其分支的所有内容),它将永远不会配置远程机器。

首先尝试perf stat以获得总(原始)性能计数器,并将perf作为srun参数; 这是使用远程shell或守护进程的工具的正确用法(可能包含perf的完整路径):

  srun -n 1 perf stat ./stream srun -n 1 /usr/bin/perf stat ./stream 

perf stat会打印目标任务的运行时间。 然后选择一些具有高原始计数器的事件(通常将采样率调整到几kHz左右,如果有足够的原始事件计数,则会产生数千个采样):

  srun -n 1 perf record -e cpu-clock ./stream srun -n 1 /usr/bin/perf record -e cpu-clock ./stream