IMC (内存集合计数器)¶
Anju T Sudhakar, 2019 年 5 月 10 日
基本概述¶
IMC (内存集合计数器) 是一种硬件监控工具,用于收集 Nest 级别(片上但脱离核心)、核心级别和线程级别的大量硬件性能事件。
Nest PMU 计数器由在 OCC(片上控制器)复合体中运行的 Nest IMC 微代码处理。 微代码收集计数器数据并将 nest IMC 计数器数据移动到内存。
核心和线程 IMC PMU 计数器在核心中处理。 核心级别 PMU 计数器为我们提供每个核心的 IMC 计数器数据,线程级别 PMU 计数器为我们提供每个 CPU 线程的 IMC 计数器数据。
OPAL 从 IMC 目录获取 IMC PMU 和支持的事件信息,并通过设备树传递给内核。 事件的信息包含
事件名称
事件偏移量
事件描述
并且可能也包含
事件比例
事件单位
某些 PMU 可能对其所有支持的事件具有通用的比例和单位值。 对于这些情况,这些事件的比例和单位属性必须从 PMU 继承。
内存中的事件偏移量是计数器数据累积的位置。
内核在具有兼容字段 ibm,opal-in-memory-counters 的 imc-counters 设备节点中的设备树中发现 IMC 计数器信息。内核从设备树中解析 PMU 及其事件的信息,并在内核中注册 PMU 及其属性。
IMC 示例用法¶
# perf list
[...]
nest_mcs01/PM_MCS01_64B_RD_DISP_PORT01/ [Kernel PMU event]
nest_mcs01/PM_MCS01_64B_RD_DISP_PORT23/ [Kernel PMU event]
[...]
core_imc/CPM_0THRD_NON_IDLE_PCYC/ [Kernel PMU event]
core_imc/CPM_1THRD_NON_IDLE_INST/ [Kernel PMU event]
[...]
thread_imc/CPM_0THRD_NON_IDLE_PCYC/ [Kernel PMU event]
thread_imc/CPM_1THRD_NON_IDLE_INST/ [Kernel PMU event]
要查看每个芯片的 nest_mcs0/PM_MCS_DOWN_128B_DATA_XFER_MC0/ 数据
# ./perf stat -e "nest_mcs01/PM_MCS01_64B_WR_DISP_PORT01/" -a --per-socket
要查看核心 0 的非空闲指令
# ./perf stat -e "core_imc/CPM_NON_IDLE_INST/" -C 0 -I 1000
要查看“make”的非空闲指令
# ./perf stat -e "thread_imc/CPM_NON_IDLE_PCYC/" make
IMC 跟踪模式¶
POWER9 支持 IMC 的两种模式,即累积模式和跟踪模式。在累积模式下,事件计数累积在系统内存中。然后,Hypervisor 定期读取或在请求时读取发布的计数。在 IMC 跟踪模式下,使用事件信息初始化 64 位跟踪 SCOM 值。跟踪 SCOM 中的 CPMCxSEL 和 CPMC_LOAD 指定要监视的事件和采样持续时间。在 CPMCxSEL 中的每次溢出时,硬件会快照程序计数器以及事件计数,并写入 LDBAR 指向的内存中。
LDBAR 是一个 64 位专用线程寄存器,它具有指示硬件是否配置为累积模式或跟踪模式的位。
LDBAR 寄存器布局¶
0
启用/禁用
1
0:累积模式
1:跟踪模式
2:3
保留
4-6
PB 范围
7
保留
8:50
计数器地址
51:63
保留
TRACE_IMC_SCOM 位表示¶
0:1
SAMPSEL
2:33
CPMC_LOAD
34:40
CPMC1SEL
41:47
CPMC2SEL
48:50
BUFFERSIZE
51:63
保留
CPMC_LOAD 包含采样持续时间。 SAMPSEL 和 CPMCxSEL 确定要计数的事件。 BUFFERSIZE 指示内存范围。 每次溢出时,硬件会快照程序计数器以及事件计数,更新内存并重新加载 CMPC_LOAD 值以用于下一个采样持续时间。 IMC 硬件不支持异常,因此如果内存缓冲区到达末尾,它会静默环绕。
目前,跟踪模式监视的事件被固定为循环。
跟踪 IMC 示例用法¶
# perf list
[....]
trace_imc/trace_cycles/ [Kernel PMU event]
要记录具有 trace-imc 事件的应用程序/进程
# perf record -e trace_imc/trace_cycles/ yes > /dev/null
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.012 MB perf.data (21 samples) ]
生成的 perf.data 可以使用 perf report 读取。
使用 IMC 跟踪模式的优势¶
避免了 PMI(性能监控中断)中断处理,因为 IMC 跟踪模式会快照程序计数器并更新到内存。 这也为操作系统提供了一种实时进行指令采样的方式,而无需 PMI 处理开销。
使用 perf top 时,有无 trace-imc 事件的性能数据。
在没有 trace-imc 事件的情况下执行 perf top 命令时,PMI 中断计数。
# grep PMI /proc/interrupts
PMI: 0 0 0 0 Performance monitoring interrupts
# ./perf top
...
# grep PMI /proc/interrupts
PMI: 39735 8710 17338 17801 Performance monitoring interrupts
# ./perf top -e trace_imc/trace_cycles/
...
# grep PMI /proc/interrupts
PMI: 39735 8710 17338 17801 Performance monitoring interrupts
也就是说,使用 trace_imc 事件时,PMI 中断计数不会递增。