Bootstrap

CPU性能优化--性能分析方法

由于linux perf是非常流行性能分析工具因此本书使用工具工具绝大部分linux发行版本都可以使用使得他的用户覆盖范围很广此外工具开源用户可以通过了解典型剖析工具内部运行机制这对理解本书讲到概念非常有帮助因为GUI类型工具intel VTune Profiler 倾向于隐藏所有复杂点

5.1 代码插桩

代码插桩可能第一个被发明性能分析方法通过程序插入额外代码采集运行信息代码清单6展示最简单代码插桩例子函数开头插入printf 语句统计函数调用次数

int foo(int x) {

printf("foo is called");

}

基于插桩剖析方法常被用在宏观层次而不是微观层次优化大段代码场景使用方法给出很好洞察结果因为你可以自上而下定位性能问题 虽然代码插桩小型程序并不是很有帮助

值得一提代码插桩具有许多不同组件复杂系统表现非常出色采样方法去除了这部分有价值信息不支持检测异常行为

例如不能提供进程调度执行频率或者发生了多少分支预测错误具有应用程序本身特权运行用户空间没有访问内核权限

在讨论插桩有必要讨论一下二进制插桩方法二进制插桩背后思想类似不过已经构建可执行文件上完成而不是源代码完成可以静态插桩动态插桩

二进制插桩性能分析调试非常有用Intel Pin非常流行二进制插桩工具之一发生关注事件Pin拦截程序的执行并从开始生成插桩代码可以收集各种运行信息例如

1 指令技术函数调用计数

2 拦截应用程序函数调用指令执行

3 通过捕获程序区域开头内存硬件寄存器状态可以实现程序区域记录

代码插桩类似二进制插桩允许插桩用户空间代码并且插桩程序运行速度可能非常慢

5.2 跟踪

跟踪依赖于程序外部依赖现有插桩例如strace工具可以跟踪系统调用可以被认为linux 内核插桩Intel 处理器跟踪Intel Processor Traces 记录程序执行指令可以认为CPU插桩跟踪可以预先插桩并且不容易改变组件获得所以跟踪通常用黑盒场景用户不能修改应用程序代码但是深入了解程序幕后做了什么场景

straceltrace 分别获取系统函数调用函数调用指令

跟踪开销取决于跟踪目标例如如果跟踪程序几乎从不进行系统那么strace 跟踪开销几乎为零相反如果跟踪程序非常依赖系统调用那么开销非常大性能可能劣化变为原本1/100此外由于跟踪不会任何样本所以会产生很多数据

代码插桩相似性能剖析并不是为了解决问题而设计但是使用跟踪技术可以

看到什么导致程序无响应使用Intel PT工具

跟踪技术对于调试工作非常重要一个工具Mozilla rr调试器可以记录回放进程支持反响单步调试功能

5.3 负载表征

负载表征通过量化参数函数 描述负载过程目标定义负载行为主要特征大体来看应用程序属于以下类型一种或者多种交互式应用程序数据库网络应用程序并行应用程序可以使用不同指标参数描述不同负载判断负载属于哪种应用程序领域

我们聚焦自顶向下微架构分析TMA方法试图通过应用程序划分4特征一类4特征分别前端绑定后端绑定退休错误投机TMA实用性能监视计数器PMC收集所需信息识别CPU微架构低效使用情况

5.3.1 统计性能事件

PMC是一种非常重要底层性能分析工具他们可以提供关于程序执行独有信息PMC通常有两种使用模式计数采样计数模式用于负载表征采样模式用于负载表征而采样模式用于寻找热点

计数器设置为0

配置事件 关闭计数功能

开启计数功能 读取计数器

开始运行基准测试

18 统计性能事件过程

18概述步骤大致代表了典型分析工具统计性能事件步骤过程perf stat工具实现可以统计各种硬件事件

perf stat输出示例如下

perf stat -- ./a.exe

这些数据很有用首先可以让我们快速发现一些异常缓存未命中或者IPC很差当你代码进行了改进想要验证性能是否提高可能派上用场查看这些数字可以帮助确定是否保留代码修改

5.3.2 手动收集性能计数

现在CPU有几百个统计性能事件我们很难记住所有的事件及其对应意思理解何时使用特定PMC就更难这就是我们通常不推荐手动收集特定的PMC

所有Intel系列CPU的性能事件参见每个事件都用十六进制EventUmask 编码有时性能事件也可以额外参数进行编码CmaskInv4展示Intel Skylake 微架构编码两个性能事件示例

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;