0

有没有办法使用 perf 动态地“实时”监控汇编指令?我已经看到,如果我使用 perf record /perf top 然后单击记录的函数,我会看到汇编指令,但我可以直接监控特定的汇编指令,例如 rdtsc 或 clflush 例如,它们被内部进程调用的频率特定时期使用性能?

我在 Skylake 和 Haswell 上使用 Debian 9。

sudo uname -a 
Linux bla 4.9.0-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux

sudo /proc/config.gz

返回 command not found

任何帮助/想法表示赞赏。

4

1 回答 1

1

是的,您当然可以构建一些动态采样主机上运行的指令的东西。

基本思想是定期对您感兴趣的进程进行采样(可能是“所有进程”),并检查采样指令指针周围的区域,以确定必须执行哪些指令才能使此类样本存在:例如,通过反汇编直到下一个条件分支,或者可能只是直到基本块的末尾。

反复执行此操作,您将获得已执行指令的直方图,然后您可以估计rdtsc运行频率或任何其他感兴趣的指令。

这实际上并不是那么困难:大部分逻辑已经存在于perf top,perf recordperf report: 中,只需将采样代码与来自和/或perf top的注释代码组合起来,如上所述。也许您甚至可以在事后执行此操作:用于收集样本,然后运行或以其他方式解析文件以监控指令。perf topperf reportperf record --all-cpusperf script

每个样本只会给你一个执行指令的小窗口,所以如果你需要rdtsc准确地捕捉偶尔的情况,这根本行不通。

您可以通过利用“最后一个分支记录”功能来扩展每个样本的“窗口”,以便根据最近的分支基本上及时返回,并分解所有这些基本块,这将大大扩展每个样本的覆盖范围。

于 2018-11-22T03:33:24.867 回答