ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cavium ThunderX2 SoC 片外 PMU(UNCORE)性能监控:L3C/DMC/CCPI2 计数器驱动与 perf 实战指南

Cavium ThunderX2 SoC 片外 PMU(UNCORE)性能监控:L3C/DMC/CCPI2 计数器驱动与 perf 实战指南 Cavium ThunderX2 SoC 片外 PMUUNCORE性能监控L3C/DMC/CCPI2 计数器驱动与 perf 实战指南【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxCavium ThunderX2 SoC 提供了独立于 CPU 核心的片外UNCORE性能监控单元PMU覆盖三级缓存L3C、DDR4 内存控制器DMC以及 Cavium 一致性处理器互连CCPI2三大子系统。本文基于内核文档 Documentation/admin-guide/perf/thunderx2-pmu.rst 与该功能对应的驱动源码 drivers/perf/thunderx2_pmu.c系统讲解 ThunderX2 UNCORE PMU 的硬件架构、驱动实现原理、sysfs 事件接口以及基于perf stat的实际监控方法帮助读者在 ThunderX2 双路服务器上精准定位内存带宽、缓存命中与互连流量等系统级瓶颈。ThunderX2 UNCORE PMU 硬件架构ThunderX2 SoC 的 PMU 由多个独立、系统级、按 Socket插槽组织的片外 PMU 组成。每个 Socket 上存在三类 PMU 设备PMU 类型全称监控对象每 Socket 交织单元数L3CLevel 3 Cache末级三级缓存16 个交织 tileDMCDDR4 Memory ControllerDDR4 内存控制器8 个交织通道CCPI2Cavium Coherent Processor InterconnectCavium 一致性处理器互连—整体计数关键设计点在于**交织interleaving与按比例折算proration**机制DMC 的 8 个通道与 L3C 的 16 个 tile 在地址上交叉分布硬件计数器实际只统计默认通道即通道 0 / tile 0的事件。驱动在读数时会将通道 0 的计数值乘以对应的交织单元数prorate factor折算为整个设备的近似总量。这一折算逻辑可以在驱动源码 drivers/perf/thunderx2_pmu.c 的tx2_uncore_event_update()中看到/* L3C and DMC has 16 and 8 interleave channels respectively. * The sampled value is for channel 0 and multiplied with * prorate_factor to get the count for a device. */ local64_add(delta * prorate_factor, event-count);其中 L3C 的prorate_factor TX2_PMU_L3_TILES (16)、DMC 的prorate_factor TX2_PMU_DMC_CHANNELS (8)、CCPI2 的prorate_factor 1分别定义于驱动初始化代码 drivers/perf/thunderx2_pmu.c。计数器规格与采样机制三类 PMU 的硬件计数器规格差异显著决定了其使用方式特性L3CDMCCCPI2可用计数器数量最多 4 个最多 4 个最多 8 个计数器位宽32 位32 位64 位溢出中断不支持不支持不支持读数方式每 2 秒定时采样每 2 秒定时采样正常操作下不会溢出源码中对应宏定义为TX2_PMU_DMC_L3C_MAX_COUNTERS (4)与TX2_PMU_CCPI2_MAX_COUNTERS (8)见 drivers/perf/thunderx2_pmu.c。每个计数器都可以独立编程为不同事件并单独启动/停止。由于 DMC/L3C 计数器为 32 位且没有溢出中断驱动采用hrtimer 定时采样策略每隔 2 秒TX2_PMU_HRTIMER_INTERVAL 2 * NSEC_PER_SEC见 drivers/perf/thunderx2_pmu.c读取一次计数器并通过差值运算处理 32 位回绕rollover/* handles rollover of 32 bit counter */ delta (u32)(((1ULL 32) - prev) new);该逻辑位于 drivers/perf/thunderx2_pmu.c。hrtimer 在第一个事件启动时开启、最后一个事件结束时取消见 drivers/perf/thunderx2_pmu.c 与 drivers/perf/thunderx2_pmu.c。CCPI2 则不同其 8 个 64 位计数器被假定为正常操作下不会溢出因此驱动不为其注册 hrtimer 回调tx2_pmu-hrtimer_callback NULL见 drivers/perf/thunderx2_pmu.c仅在事件被读取时perf read或perf stat结束时才从寄存器取数省去了周期性中断开销。驱动架构与设备发现ACPI 驱动的设备枚举thunderx2_pmu驱动通过ACPI 命名空间遍历完成设备发现而不是传统的设备树或 platform 匹配。驱动以CAV901C作为平台设备匹配 ID见 drivers/perf/thunderx2_pmu.c在probe阶段调用acpi_walk_namespace()遍历 ACPI 设备树逐一识别三类 UNCORE 设备ACPI 设备 IDPMU 类型枚举值CAV901DL3CPMU_TYPE_L3CCAV901FDMCPMU_TYPE_DMCCAV901ECCPI2PMU_TYPE_CCPI2设备 ID 到类型的映射定义于 drivers/perf/thunderx2_pmu.c 的get_tx2_pmu_type()。每个被发现的设备通过_CRS方法解析内存资源IORESOURCE_MEM映射寄存器基址后初始化对应的 PMU见 drivers/perf/thunderx2_pmu.c。按 Socket 注册 per-socket PMU驱动为每个 Socket 上的每个设备注册独立的 perf PMU命名遵循uncore_设备_socket_id规则uncore_l3c_0/uncore_l3c_1节点 0 / 节点 1uncore_dmc_0/uncore_dmc_1uncore_ccpi2_0/uncore_ccpi2_1命名代码见 drivers/perf/thunderx2_pmu.c。驱动还通过CPU hotplug 回调维护 PMU 与在线 CPU 的绑定关系当绑定 CPU 下线时会把事件上下文迁移到同节点的其他在线 CPU见 drivers/perf/thunderx2_pmu.c保证计数不中断。编译配置该驱动由内核配置项CONFIG_THUNDERX2_PMU控制编译规则位于 drivers/perf/Makefileobj-$(CONFIG_THUNDERX2_PMU) thunderx2_pmu.osysfs 事件与配置接口驱动为每个 PMU 在 sysfs 下导出了三类属性组format事件编码格式、events可用事件及事件 ID、cpumaskPMU 绑定的 CPU。设备节点位于/sys/bus/event_source/devices/uncore_l3c_S/dmc_S/ccpi2_S/其中S为 Socket节点ID。format事件编码格式L3C / DMC事件编码使用config:0-45 位事件 ID 范围 0–31CCPI2事件编码使用config:0-910 位事件 ID 范围更大format 属性定义于 drivers/perf/thunderx2_pmu.c。perf工具通过解析 format 属性得知如何在config字段中编码事件 ID。events可用事件驱动共导出 12 个可命名事件。DMC 与 L3C 事件由 sysfs 宏TX2_EVENT_ATTR自动生成见 drivers/perf/thunderx2_pmu.c每个事件文件内容形如event0x...。DMCDDR4 内存控制器事件事件名事件 ID含义cnt_cycles0x1DMC 时钟周期计数write_txns0xB写事务数data_transfers0xD数据传输次数粒度为 16 字节读数时驱动会除以 4 折算为 64 字节read_txns0xF读事务数DMC 事件 ID 定义见 drivers/perf/thunderx2_pmu.c。值得注意data_transfers事件在读数时会被驱动特殊处理——硬件以 16 字节为粒度计数驱动将其除以 4 换算为 64 字节缓存行粒度见 drivers/perf/thunderx2_pmu.c。L3C三级缓存事件事件名事件 ID含义read_request0xD读请求writeback_request0xE写回请求inv_nwrite_request0xF无效化写请求inv_request0x10无效化请求evict_request0x13驱逐请求inv_nwrite_hit0x14无效化写命中inv_hit0x15无效化命中read_hit0x17读命中L3C 事件 ID 定义见 drivers/perf/thunderx2_pmu.c。CCPI2一致性互连事件事件名事件 ID含义req_pktsent0x3D发送的请求包数snoop_pktsent0x65发送的监听包数data_pktsent0x105发送的数据包数gic_pktsent0x12D发送的 GIC 包数CCPI2 事件 ID 定义见 drivers/perf/thunderx2_pmu.c。此外驱动还导出了cpumask属性指示该 PMU 当前绑定的 CPU方便用户理解计数由哪个核负责读取。使用 perf 进行 UNCORE 监控基本用法单个事件# 统计 1 秒内 Socket 0 DMC 的时钟周期数 perf stat -a -e uncore_dmc_0/cnt_cycles/ sleep 1组合监控DMC 内存带宽相关事件# 同时统计 Socket 0 DMC 的周期、数据传输、读写事务 perf stat -a -e \ uncore_dmc_0/cnt_cycles/,\ uncore_dmc_0/data_transfers/,\ uncore_dmc_0/read_txns/,\ uncore_dmc_0/write_txns/ sleep 1组合监控L3C 缓存行为# 同时统计 Socket 0 L3C 的读请求、读命中、无效化请求与无效化命中 perf stat -a -e \ uncore_l3c_0/read_request/,\ uncore_l3c_0/read_hit/,\ uncore_l3c_0/inv_request/,\ uncore_l3c_0/inv_hit/ sleep 1使用要点必须使用-aall CPUsUNCORE 计数器是系统级共享的perf事件初始化代码在event-cpu 0时直接返回-EINVAL见 drivers/perf/thunderx2_pmu.c因此不支持不带-a的 CPU 选择方式驱动会自动把事件绑定到该 PMU 所属节点上的在线 CPU。事件名可通过perf list发现perf list会从 sysfs 读取 events 属性显示uncore_dmc_0/cnt_cycles/等完整事件列表。按需监控特定 Socket如需观察远端 Socket 的内存流量将事件前缀中的_0换成_1即可。使用限制与注意事项不支持采样samplingThunderX2 UNCORE PMU 不支持溢出中断与采样模式因此perf record无法工作。驱动在事件初始化时通过is_sampling_event(event)显式拒绝采样事件见 drivers/perf/thunderx2_pmu.c。如需定位到具体指令/函数的性能问题应使用核心corePMU 的采样能力UNCORE PMU 仅适合系统级吞吐与命中率统计。不支持 per-task 会话由于 SOC 级计数器为所有核心共享无法区分单个进程的访问驱动同样拒绝PERF_ATTACH_TASK类型的 per-task 事件见 drivers/perf/thunderx2_pmu.c。只能使用-a的 system-wide 模式。事件组校验驱动实现了事件组校验逻辑tx2_uncore_validate_event_group()见 drivers/perf/thunderx2_pmu.c拒绝跨多个硬件 PMU 的事件组即不能把uncore_dmc_0和uncore_l3c_0的事件放进同一个{}组且组内事件总数不能超过该 PMU 的最大计数器数DMC/L3C 为 4CCPI2 为 8否则该组永远无法被调度。计数器分配失败当某个 PMU 的计数器全部被占用时alloc_counter()返回-ENOSPC新事件将以-EAGAIN失败见 drivers/perf/thunderx2_pmu.c 与 drivers/perf/thunderx2_pmu.c。实际使用中表现为perf stat报出无法调度足够事件此时应减少同时监控的事件数量或拆分到不同 PMU。数据粒度与近似性由于采用通道 0 采样后按交织因子折算的机制data_transfers等事件读数为全设备近似值而非逐通道精确累加同时 32 位计数器配合 2 秒采样周期若某事件在 2 秒内计数超过 2^32 会产生折算后的低估因此对于极高频事件的长时间统计应结合perf stat的分段输出评估误差。深入理解寄存器级实现驱动将事件配置写入三类硬件寄存器组偏移定义见 drivers/perf/thunderx2_pmu.cL3CCOUNTER_CTL (0xA8) 每计数器 8 字节间隔的COUNTER_DATA (0xAC)事件 ID 编码在控制寄存器bits[07:03]见uncore_start_event_l3c()drivers/perf/thunderx2_pmu.c。DMC统一COUNTER_CTL (0x234) 每计数器 0xC 字节间隔的COUNTER_DATA (0x240)每个计数器占用控制字 8 位事件 ID 编码在bits[05:01]见uncore_start_event_dmc()drivers/perf/thunderx2_pmu.c。CCPI2通过COUNTER_SEL (0x12C)选择计数器索引从 8 到 15事件 ID 编码在bits[09:00]并强制设置上升沿电平BIT(10)与边沿敏感类型BIT(11)PERF_CTL (0x108)控制复位/启动/使能见uncore_start_event_ccpi2()drivers/perf/thunderx2_pmu.c。理解这些寄存器行为有助于解读perf stat输出与排查配置错误但对日常使用而言只需通过命名事件即可完成绝大多数监控任务。小结ThunderX2 UNCORE PMU 驱动为系统级性能分析提供了开箱即用的能力L3C、DMC、CCPI2 三类 per-socket PMU 覆盖了缓存、内存与互连三大子系统通过perf stat -a配合uncore_dmc_0/event/、uncore_l3c_0/event/、uncore_ccpi2_0/event/语法即可快速量化内存带宽、缓存命中率与片间一致性流量。使用时应牢记其限制——不支持采样与 per-task、依赖通道 0 折算、32 位计数器需 2 秒定时采样——从而在 ThunderX2 平台上获得准确且可解释的性能数据。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表