请注意,perf
确实允许同时测量超过 2 个 PERF_TYPE_HW_CACHE 事件,但LLC-cache
事件测量除外。
期望是,当有 4 个通用和 3 个固定用途的硬件计数器时,RAW
perf 中的 4 个 HW 缓存事件(默认为 events)可以在不复用的情况下测量,超线程 ON。
sudo perf stat -e L1-icache-load-misses,L1-dcache-stores,L1-dcache-load-misses,dTLB-load-misses sleep 2
Performance counter stats for 'sleep 2':
26,893 L1-icache-load-misses
98,999 L1-dcache-stores
14,037 L1-dcache-load-misses
723 dTLB-load-misses
2.001732771 seconds time elapsed
0.001217000 seconds user
0.000000000 seconds sys
当您尝试测量针对LLC-cache
. 它似乎只同时测量 2 个LLC-cache
特定事件,没有多路复用。
sudo perf stat -e LLC-load-misses,LLC-stores,LLC-store-misses,LLC-loads sleep 2
Performance counter stats for 'sleep 2':
2,419 LLC-load-misses # 0.00% of all LL-cache hits
2,963 LLC-stores
<not counted> LLC-store-misses (0.00%)
<not counted> LLC-loads (0.00%)
2.001486710 seconds time elapsed
0.001137000 seconds user
0.000000000 seconds sys
属于skylake/kaby lake
微体系结构家族和其他一些的 CPU 允许您测量OFFCORE RESPONSE
事件。监视OFFCORE_RESPONSE
事件需要对额外的 MSR 进行编程,特别是MSR_OFFCORE_RSP0
(MSR 地址 1A6H)和MSR_OFFCORE_RSP1
(MSR 地址 1A7H),此外还需要对IA32_PERFEVTSELx
和IA32_PMCx
寄存器进行编程。
每对IA32_PERFEVTSELx
和IA32_PMCx
寄存器将与上述 MSR 之一相关联,以测量 LLC 缓存事件。
MSR的定义OFFCORE_RESPONSE
可以在这里看到。
static struct extra_reg intel_skl_extra_regs[] __read_mostly = {
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0),
INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1),
........
}
0x01b7
在INTEL_UEVENT_EXTRA_REG
调用中指的是 event-codeb7
和 umask 01
。此事件代码0x01b7
映射到 LLC 缓存事件,如下所示-
[ C(LL ) ] = {
[ C(OP_READ) ] = {
[ C(RESULT_ACCESS) ] = 0x1b7, /* OFFCORE_RESPONSE */
[ C(RESULT_MISS) ] = 0x1b7, /* OFFCORE_RESPONSE */
},
[ C(OP_WRITE) ] = {
[ C(RESULT_ACCESS) ] = 0x1b7, /* OFFCORE_RESPONSE */
[ C(RESULT_MISS) ] = 0x1b7, /* OFFCORE_RESPONSE */
},
[ C(OP_PREFETCH) ] = {
[ C(RESULT_ACCESS) ] = 0x0,
[ C(RESULT_MISS) ] = 0x0,
},
},
该事件0x01b7
将始终映射到MSR_OFFCORE_RSP_0
,如这里所示。上面指定的函数循环遍历所有“额外寄存器”的数组,并将 event->config(包含原始事件 id)与核心响应 MSR 相关联。
因此,这意味着一次只能测量一个事件,因为只有一个 MSR -MSR_OFFCORE_RSP_0
可以映射到一个LLC-cache
事件。但事实并非如此!
核心外寄存器本质上是对称的,因此当第一个 MSR -MSR_OFFCORE_RSP_0
寄存器忙时,perf
使用第二个替代 MSRMSR_OFFCORE_RSP_1
来测量另一个核心外 LLC 事件。此处的此功能有助于做到这一点。
static int intel_alt_er(int idx, u64 config)
{
int alt_idx = idx;
if (!(x86_pmu.flags & PMU_FL_HAS_RSP_1))
return idx;
if (idx == EXTRA_REG_RSP_0)
alt_idx = EXTRA_REG_RSP_1;
if (idx == EXTRA_REG_RSP_1)
alt_idx = EXTRA_REG_RSP_0;
if (config & ~x86_pmu.extra_regs[alt_idx].valid_mask)
return idx;
return alt_idx;
}
对于微架构系列,仅存在 2 个内核外寄存器Kaby-Lake
阻碍了在没有任何多路复用的情况下同时针对超过 2 个 LLC 缓存事件测量的能力。