6.4 CPU性能分析--Intel处理器跟踪技术

Intel处理器跟踪PT技术记录程序执行过程技术它把记录信息编码存到高压缩二进制文件中二进制文件结合每条指令时间戳重建执行PT技术覆盖度开销有关开销信息详见主要用于性能问题事后分析根因定位

6.4.1 工作流

类似于采样技术PT技术不需要修改任何源代码只要支持PT技术工具下运行目录程序然后抓取跟踪文件即可一旦启动PT基准测试程序开始运行分析工具开始跟踪报文记录到DRAM

类似于LBR Intel PT技术通过记录分支实现程序运行只要CPU遇到分支跳转指令PT将会记录这个分支跳转指令输出对于简单分支跳转指令CPU会用一位记录是被选中还是选中NT对于间接调用PT记录目标地址注意条件分支跳转指令不会记录因为我们知道目标地址

37展示小型指令序列编码类似PUSH,MOV, ADDCMP这样指令会被忽略因为他们不会改变控制然而指令JE可能会跳转label, 所以结果需要记录下来

在分析我们应用程序二进制文件采集PT跟踪信息汇总到一起软件解码器需要应用程序二进制文件重建程序执行入口开始然后采集跟踪信息作为查询参考决定控制流38展示一个解析Intel PT文件例子假设Push指令应用程序二进制文件入口点然后Push mos addCMP保持原来重建这一步查询解析跟踪信息接着软件解码器开始处理JE指令分支跳转指令因此我们需要查询分支跳转指令输出根据38跟踪文件JE条件选中T所以跳过MOV指令调用了CALL指令

我们接着继续分析CALL 也是一个可以改变控制指令因此我们需要解析后跟踪信息查找目标地址它是0x407e1d8高亮指令程序运行过程被执行注意这就是程序运行精确重建并且不会跳过任何指令接下来我们可以通过调试信息汇编指令映射回源代码获得源代码逐行日志

运行时

指令 编码

push

mov

cmp

je.label

mov

label

call 虚函数

37 Intel处理器跟踪PT编码

6.4.2 时间报文

Intel PT工具不仅可以跟踪执行还可以记录时间信息作为保存跳转目标地址补充PT工具还可以产生时间报文39提供了一个时间报文如何用来恢复指令时间戳可视化展示示例前面例子一样我们首先看到JNE没有选中所以需要把它之上所有指令时间戳更新0ns, 然后我们看到一个2ns时间更新JE指令选中所以把它之上所有指令时间戳都更新2ns往后一条间接调用指令但是没有相关时间报文所以我们不需要更新时间戳然后我们看到一个100ns时间更新并且指令JB没有被选中所以其上所有指令时间戳都要更新102ns

39指令数据非常精确但是时间信息没有那么精确显然指令CALL TESTJB不会同时发生但是我们没有有关它们更精确时间信息有了时间戳我们可以程序系统其他事件时间间隔进行对齐并且很容易挂钟时间进行比较某些实现跟踪时许可以通过时钟周期精确模式进一步改进其中硬件记录正常数据报文之间时钟周期计数

分析

指令

mov

jnz

add

cmp

je.label

mov

.label

call

test

jb

6.4.3 采集和解析跟踪文件

Linux perf工具可以方便采集IntelPT跟踪文件

perf record -e intel_pt/cycle/u ./a.out

6.4.4 用法

可能使用PT技术处理的几个例子

1 分析性能问题 因为PT会采集所有指令所以可以分析应用程序无响应一小段时间发生了什么更多详细例子相见easyperf 博客上文章

2 事后调试 PT跟踪文件可以使用传统调试工具此外PT还会提供调试信息即使破坏情况也总是有效PT跟踪文件可以远程机器上采集然后再离线分析

3 程序执行回溯

可以快速发现哪些代码路径从未被执行

借助时间戳发生自旋锁尝试可以计算出等待花费多长时间

通过检测待定指令模式检测安全问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值