Perf Arm SPE介绍与使用
内容分析:
1. 背景介绍
2. Arm SPE的原理
3. Arm SPE在倚天服务器上的应用
4. Arm SPE 更多特性与功能的探索
01. 背景介绍
这张图展示了性能分析工具在多个架构上的对比情况。在倚天 710 架构下,若缺乏 Arm SPE 硬件特性支持,性能分析工具会存在功能缺失。例如,无法实现缓存竞争检测、内存访问分析、缓存延时监控以及指令延时分析等功能。而在 x86 架构中,凭借 Perf 等硬件特性可支持这些功能;鲲鹏 920 也有其 PMU 与 SPE 机制,其中 SPE 缺乏了监控访问主内存平均延时的能力。在倚天平台上, Arm SPE 机制的支持使这些性能分析工具得以完善。
目前,在龙蜥操作系统的倚天服务器上,利用 PMU 和 Arm SPE 等硬件特性,结合驱动与 Perf 工具,实现了多种性能诊断分析方法,如内存访问、内存带宽及跨代带宽等功能。这些功能已集成到阿里云自研的 PaaS 工具平台,并且已经在平台上进行了运行和推广。
02. Arm-SPF介绍
2.1 ArmSPE 原理
Arm SPE 是 Armv8.2 硬件中的一项可选功能,它允许对 CPU 指令进行采样,并收集微操作的相关信息,如 PC 值、数据地址、数据类型以及时间戳等。为避免采集信息过多占用大量内存,SPE还添加了过滤功能。收集的指令信息有助于进行性能诊断与故障调优。 Arm SPE 的优势在于能够将采集的延时和保存的事件信息准确归因到单个指令。它通过对一条指令进行采样,并在指令执行期间捕获采样指令的信息,再写入缓冲区。在收集数据过程中,不占用 CPU 资源,与 PMU 相比, Arm SPE 采集的数据更准确,不存在因中断触发再写入缓冲区的时延问题,具有无打滑、无盲点的优势。
2.2 Arm SPE 的采样过程
Arm SPE 的采样过程主要分为以下步骤:默认每经过 1024 个微操作,选择其中一个作为采样样本,记录其 PC 、触发事件、延时信息、数据来源及操作类型等信息。根据用户配置的过滤条件,对采集的样本进行过滤,将所需内容写入缓冲区。被追踪的每一条微操作最终会形成一个由多个 Packet 组成的 Record ,当内存被这些 Record 填满后,会触发中断,将数据写入 Perf.Data 中。
Arm SPE 采样的微操作 Record 由多个 Packet 组成,包括地址包、事件包、操作类型包等。其中,还有一个 Counter Packet 操作在 CPU 流水线上经过的 Cycle 数统计、时间戳以及数据来源。数据来源包仅针对访存指令。
2.3 Arm SPE 的事件包
Arm SPE 事件包中共展示了 11 个事件,包括指令的 Retire 、异常生成,以及 L1、L2、LLC、Remote 等事件。在倚天 710 上,LLC Access 或 Refill 在硬件层面代表的是 L2 Cache,而不是 System Level Cache 。 Remote Access 在 Arm SPE SPEC 中通常表示发生了跨 Socket 访问,但在倚天实际应用中,Remote 不仅表示跨 Socket ,跨代访问也会标记为 Remote 。
2.4 Arm SPE 的数据来源
Arm SPE 将访存指令的数据来源分为 8 类,包括常见的 L1、L2 等。 Peer Core 指数据来源于同一个 Cluster 的另一个核的 L1 或 L2 Cache ; Local Cluster 指访问的最新数据来源于同一个 Cluster 内共享的 L3 Cache 。然而,倚天 710 采用的是 One Core One Cache 架构,不存在 Peer Core 和 Local Cluster 这两种数据来源。另外 4 类数据来源为 System Cache、Peer Cluster、Remote 和 DRAM 在倚天平台上也有特殊之处。
通过图例说明,绿色表示发送访存请求的核,红色表示要访问的最新数据所在位置,黄色表示数据所属的 SLC 或 DRAM 。在倚天平台上,若 Arm SPE 标记数据来源为 SLC ,无论 SLC 与请求核是否在同一代,都会标记为 SLC ;DRAM 同理。 Remote 有两种情况:一是请求核与数据所属 DRAM 在同一代,但最新数据在另一代核的 L1 或 L2 Cache 中;二是请求核与数据所属 DRAM 跨代,但最新数据与请求核在同一代的另一个核中。 Peer Cluster 也有两种情况,取决于请求核与 DRAM 是否在同一代,以及数据是否来源于同一代的另一个核。
2.5 Arm SPE 的延时数据
Arm SPE 的延时数据分为三种。第一种是 Total Latency ,表示一个微操作从被分派进入等待发射队列,到最终执行完成所经过的 Cycle 总数,所有微操作都有此延时数据。第二种是发射延时,指微操作被分解进入发射队列,到最终发射出去执行变为执行状态期间的延时,所有微操作也都具备该数据。第三种是 Translation Latency,仅针对 Load、Store 和 Atomic operations 这三种访存操作,指访问的数据从虚拟地址进入 MMU ,转换成可访问地址所经过的时间
03. Arm SPE在倚天服务器上的应用
Perf 工具可利用 Arm SPE 的事件来分析程序的访存行为。通过对样本事件进行分类,可将每类指令及对应的每行代码,按发生的事件类别进行划分,从而了解哪些指令发生了较为严重的某类事件,比如 Remote 事件。同时,还有汇总功能,还能将所有访存指令汇总到 Memory 分类中,这是 Perf 工具的一项功能。
利用 Arm SPE 的数据来源, Perf 工具还可实现缓存行竞争分析功能。 Arm SPE 数据来源的 8 类中, L1、L2、System Cache、DRAM 这四类可认为未发生缓存行竞争,而 Peer Core、Local Cluster、Peer Cluster、Remote 这四类可认为发生了缓存行竞争行为,其中前三种可以认为发生了 Local Snoop 和 Remote Snoop 行为。通过对数据来源进行分类,能够知晓哪些指令及对应的代码行发生了缓存行迁移动作,进而分析代码并优化。
例如,利用 Perf 检测伪共享。在多线程编程中,不同线程修改位于同一缓存行内的不同变量,会导致不必要的缓存一致性流量,严重影响性能,尤其是产生较多 Remote 行为时。通过 Perf c2c Record 采集需分析的二进制程序,再利用 Perf c2c Report 解析采集信息。解析报告可显示 0×420140 和 0×420100 发生严重 Remote 缓存行竞争行为的地址,选择其中一个缓存行进一步分析,可得知对应的代码地址及源码位置。这里面显示 False_Sharing C:175 可以对应到在源码文件进行分析的,发现这个特定代码发生了严重的 Remote 缓存行竞争行为。具体可以分析是否是由于访问的变量所在结构体未进行缓存行对齐,导致不同变量处于同一缓存行,频繁读写时引发竞争。优化方法是将无关变量分开到不同缓存行。利用此 Perf 伪共享检测方法优化倚天平台上的 x265 编码器,其性能指标 FPS 提升了 8.6 %。
Perf 工具还可通过 Perf Memory Record 采集应用程序的访存数据。以一个例子说明,首先将所有指令按发生的事件分类,图中最左边一列代表采集到的样本数量。通过分析发现,其中发生 Remote Access 的只有 720 条,但是 LLC Miss 的有 2000 多条。选择 LLC Miss (在倚天平台即 L2 Cache Miss )进一步分析,发现某些指令发生 L2 Miss 较多,占比约百分百。再进一步查看 Remote Access ,可展示该指令类型的总延时信息,从而了解程序中某条指令经过的延时,进行具体分析。
关于指令延时的应用, Arm SPE 具备访存延时监控能力,这里的访存延时指访问主内存的延时。在业务中,通过获取访存延时可判断机子是否访存过载,若达到拐点值,需对服务器上的业务进行迁移。 x86 平台有统计访存延时的 PMU ,倚天平台虽未实现特定的 DDRC PMU 来监控访存延时,但 Arm SPE 可提供指令级别的访存延时。由于 SPE 在核内,而我们需获取 DDR 的访问延时,因此采用如下方法:若指令为 Load 指令,且数据来源为 DRAM ,则其访存延时约等于总延时减去发射阶段的等待延时,再减去地址翻译的延时。但是 Arm SPE 应用到线上业务存在两个问题:一是 4095 限制, Arm SPE 记录的访存延时最大只能到 4095 个 SQL ,因仅有 12 位存储该信息。但经实验总结,日常业务应用中超过 4095 个 SQL 的访存指令占比相对较小,若出现此类情况,可表明服务器访存已过载,此问题可忽略。二是线上 Arm SPE 业务采集开销问题, Arm SPE 提供的过滤功能可减少数据量,还可从采集核和采集时间策略上进一步降低内存和 CPU 开销。例如,每 8 个核选取一个核作为代表,以该核采集的指令访存延时代表整机延时,减少采集数量;从采集时间上,采 5 秒代表 30 秒内的访存平均延时,进一步减少数据量。
实际应用中,原生 Perf 工具实现 Arm SPE 功能流程复杂,需先采集数据,遍历诸多组件,解析用户输入参数,存储数据到文件,再通过 Report 解析,最后通过脚本提取实际数据来源为 DRAM 的指令延时。此过程启动开销大、采集数据量多、分布解析不实时且涉及多重拷贝,无法直接应用于线上业务。因此,我们设计了另一个工具 Pass Light SPE 。其步骤为:直接从二进制程序协定要采集命令对应的寄存器,识别 Armv8 上的 Arm SPE 设备,配置过滤条件,如仅采集 Load 指令且数据来源为 DRAM ,进一步叠加条件,如仅采集 L2 Miss 之后且总延时超过 150 个纳秒的数据。配置好过滤条件后提取内核数据,将采集的数据放入内核包,直接提取内核包中数据来源为 DRAM 的 Load 指令延时并计算,按代输出平均延时。此方法启动开销小、数据量小,可实时并且减少很多拷贝步骤,可以看出它能按代显示每个代里面的平均延时及采集到的样本数,单位为纳秒。
此外, Arm SPE 还有很多使用方法,通过叠加多种事件类型和延时过滤办法,可采集到所需数据,减少数据量。例如,可采集延时大于 100 个 SQL 且可以叠加指令为 Retire 的样本。通过这样的叠加可以采集到想要的数据,减少数据量。
04. Arm-SPE 更多特性与功能的探索
Arm SPE 还有许多信息可深入挖掘。例如,分支跳转信息可应用于 Auto ID 编译优化; Arm SPE 的物理地址信息可用于冷热内存识别优化;时间戳和 PC 地址信息可应用于 Auto Prefetch 编译优化。目前这些应用我们仍在探索阶段,在此仅作抛砖引玉。