假设我有一个线束二进制文件,它可以根据命令行选项产生不同的基准。我对采样这些基准非常感兴趣。
我有3个选择:
更改线束二进制文件以生成运行基准测试并进行采样的“性能记录”子进程
只需执行“perf record $harness-binary”,希望它也能对子进程进行采样。
“perf record -a $harness-binary”,它将执行“来自所有 CPU 的系统范围的收集。”。这需要 root 访问权限,因此在我的情况下不可行。
如果 perf-record 真的对子进程进行采样,则方法 #2 是干净的。有人可以帮助确认是否是这种情况吗?指向文档或性能代码的指针将不胜感激。
如果方法#2 可行并且基准测试比线束更占用 CPU,我认为基准采样的质量应该相当不错,对吧?
谢谢
perf record没有-a选项记录所有进程,在记录开始后从目标进程分叉(和克隆的线程)。有了perf record ./program它描绘所有的子进程也是如此,并与perf record -p $PID与安装到已经运行$ PID会简介目标进程和安装后启动的所有子进程。默认情况下启用分析继承(所需代码:attr->inherit = !opts->no_inherit;& no_inherit),可以使用-ioption 禁用,也可以通过-t和禁用--per-thread。
这种继承就像在perf stat:https : //perf.wiki.kernel.org/index.php/Tutorial
计数和继承
默认情况下, perf stat 对进程的所有线程以及后续子进程和线程进行计数。这可以使用 -i 选项进行更改。不可能获得每个线程或每个进程的计数细分。
而-i选项是有perf record太多:http://man7.org/linux/man-pages/man1/perf-record.1.html
Run Code Online (Sandbox Code Playgroud)-i, --no-inherit Child tasks do not inherit counters.
perf report 可以从收集的组合 perf.data 文件中过滤来自某些 PID 的事件。