Intel SPR架构下perf中LLC事件ID重复的区分方法问询
- 使用环境:Intel Sapphire Rapids(SPR)架构,内核版本5.14,perf版本4.18
- 遇到的问题:
- 分析LLC相关事件含义时,发现所有事件ID均相同:
[ C(LL ) ] = { [ C(OP_READ) ] = { [ C(RESULT_ACCESS) ] = 0x12a, [ C(RESULT_MISS) ] = 0x12a, }, [ C(OP_WRITE) ] = { [ C(RESULT_ACCESS) ] = 0x12a, [ C(RESULT_MISS) ] = 0x12a, }, }, - 查看Intel perfmon的SPR事件定义时,发现大量事件共享相同的
EventCode和UMask,仅通过MSRValue区分,例如:{ "EventCode": "0x2A,0x2B", "UMask": "0x01", "EventName": "OCR.DEMAND_DATA_RD.ANY_RESPONSE", "BriefDescription": "统计有任何响应的按需数据读取次数。", "MSRIndex": "0x1a6,0x1a7", "MSRValue": "0x10001", "Offcore": "1" }, { "EventCode": "0x2A,0x2B", "UMask": "0x01", "EventName": "OCR.DEMAND_RFO.ANY_RESPONSE", "BriefDescription": "统计有任何响应的所有权读取(RFO)请求和独占所有权软件预取(PREFETCHW)次数。", "MSRIndex": "0x1a6,0x1a7", "MSRValue": "0x3F3FFC0002", "Offcore": "1" }
- 分析LLC相关事件含义时,发现所有事件ID均相同:
- 疑问:如何区分perfmon中的条目与perf里每个LLC相关事件的对应关系?
要区分这类共享EventCode/UMask、靠MSRValue区分的事件,核心是理解Offcore Response事件的工作机制——这类LLC相关事件属于Offcore事件,需要通过配置MSR(0x1A6/0x1A7)来筛选特定的内存访问类型,具体步骤如下:
解析perf事件ID的构成
perf里的0x12a是EventCode | (UMask << 8)的计算结果:0x2A是EventCode,0x1是UMask(0x1 << 8 = 0x100,0x100 + 0x2A = 0x12A),对应perfmon中EventCode=0x2A,0x2B且UMask=0x01的条目,这些都是Offcore Response事件。按语义匹配事件与MSRValue
perf里的LLC事件(读访问/读缺失、写访问/写缺失)对应perfmon中不同的MSRValue配置,因为MSRValue是用来指定要计数的内存请求类型和结果的:- 对于
LLC OP_READ RESULT_ACCESS:找perfmon中描述为“统计LLC读访问”的条目,其MSRValue会配置为筛选读请求且访问成功的规则 - 对于
LLC OP_READ RESULT_MISS:找描述为“统计LLC读缺失”的条目,MSRValue会筛选读请求且未命中LLC的规则 - 写操作的对应事件以此类推,重点看
BriefDescription或PublicDescription中的语义匹配
- 对于
验证事件配置的一致性
可以通过perf list命令查看LLC事件的详细定义,或者用perf stat -e <事件名称>运行测试,对比perfmon中对应MSRValue的事件描述,确认计数逻辑是否一致。另外,也可以查看内核源码中SPR架构的perf事件定义文件(如arch/x86/events/intel/spr.c),里面会明确每个LLC事件对应的MSR配置。注意版本兼容性问题
你的perf版本4.18远低于内核版本5.14,可能存在事件定义不匹配的问题——旧版本perf可能未完整支持SPR的Offcore事件,导致所有LLC事件复用同一个ID。建议升级perf到与内核版本接近的版本,以获得更准确的事件映射。
内容的提问来源于stack exchange,提问作者Frontier_Setter

