好的,所以这真让我烦恼。
我使用perf记录cpu-clock事件(软件事件):
$ > perf record -e cpu-clock srun -n 1 ./stream
...而且perf报告生成的表格是空的。
我使用perf来记录perf list中列出的所有可用软件事件:
$ > 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-clock中收集的样本,它给了我信息。为什么?!如果我只测量cpu-clock,为什么它不起作用?为什么四个活动中没有收集样本?
这是这个问题的后续行动: error: perf.data file has no samples
答案 0 :(得分:0)
可能srun
不能直接使用fork启动目标进程。它可以使用一些varian ot远程shell,如ssh或daemon来启动进程。
perf record
(没有-a
选项)将仅跟踪直接分叉的子进程,而不是由sshd或其他守护进程启动(分叉)的进程。如果srun
可以使用perf record ... srun
命令并且使用perf stat
命令,它将永远不会对远程机器进行概要分析(这是为了分析srun应用程序及其所有内容)。
首先尝试 srun -n 1 perf stat ./stream
srun -n 1 /usr/bin/perf stat ./stream
获取总(原始)性能计数器,并将perf作为srun参数;这是使用远程shell或守护进程的工具的正确用法(可能具有perf的完整路径):
perf stat
srun -n 1 perf record -e cpu-clock ./stream
srun -n 1 /usr/bin/perf record -e cpu-clock ./stream
将打印目标任务的运行时间。然后选择一些具有高原始计数器的事件(性能记录通常将采样率调整到几kHz左右,因此如果有足够的原始事件计数,将生成数千个样本):
{{1}}