动态监控 rdtsc 的性能

Posted

技术标签:

【中文标题】动态监控 rdtsc 的性能【英文标题】:Perf Monitoring for rdtsc dynamically 【发布时间】:2018-11-20 09:56:08 【问题描述】:

有没有办法使用 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

感谢任何帮助/想法。

【问题讨论】:

如果你想将自己限制在一个过程中,请使用 BDI 工具(如 frida、dynamoRio 甚至 rr)。在整个系统范围内,我认为在合理的性能下这是不可能的。 听起来很像this question 感谢您的回答。但是,我没有具体的流程,也不想做二进制检测。如果我使用性能计数器监控,例如,使用 perf 我可以在运行时看到 rdtsc,但前提是我手动单击调用它的函数。这就是为什么我认为可能有一种方法.. 设置一些寄存器或其他什么 大多数特定指令都没有 perf 事件。对于除法,有arith.divider_active。您可能会发现带有idq.ms_cycles 的微编码指令,但这并不特定于rdtscclflush。 (不过,我不确定 clflush 是否超过 4 微秒。) 不,您不能使用 perf 来做到这一点。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

您好,感谢您的回答!问题是我不知道如何得到这个指令来计算它。如果我使用 perf top 并单击调用她的进程并查看相应的汇编代码并在那里我看到指令,我会看到已使用 rdtsc,但如果我想使用 --all-cpus 导出统计信息选项,我不知道我应该解析什么。使用 perf 脚本并没有直接显示它。你能给我一个提示吗?

以上是关于动态监控 rdtsc 的性能的主要内容,如果未能解决你的问题,请参考以下文章

使用动态跟踪技术SystemTap监控MySQLOracle性能

Skywalking全链路监控集群和动态部署

监控io性能

ORACLE常用性能监控SQL

动态性能视图

Linux性能监控-ps