Linux perf x86平台进程级cache-misses事件计数准确性问询
Intel x86下Perf统计特定进程L3缓存未命中的原理
在Intel x86系统中,cache-misses事件映射为LONGEST_LAT_CACHE.MISS,用于统计核心发起的可缓存请求未命中L3缓存的次数。针对你提出的问题,直接给出结论:
执行$ perf stat -e cache-misses -- ls时,统计的是进程ls自身产生的L3缓存未命中次数,而非系统全局的。
具体原因如下:
- 上下文关联的事件过滤:虽然L3缓存属于uncore区域,对应的PMU是所有核心共享的,但Perf会结合CPU的调度机制,追踪目标进程的执行上下文。当
ls进程在某个核心上运行时,Perf会通过硬件提供的过滤能力(比如基于CR3寄存器的地址空间标识,或者线程上下文切换事件),只统计该进程触发的L3未命中请求,自动排除其他进程、内核线程或空闲状态下的全局事件。 - 进程运行时段的精准计数:Perf会监控目标进程的生命周期,只有当
ls处于运行状态(占用CPU核心执行指令)时,才会对LONGEST_LAT_CACHE.MISS事件进行计数,进程休眠或被调度走的时段,不会统计该事件。 - 硬件支持的基础:主流现代Intel处理器(Sandy Bridge及以后的架构)的uncore PMU都支持进程级的事件过滤,这是Perf实现精准统计的硬件基础。少数老款处理器可能存在限制,但这种情况非常少见。
验证方法
你可以通过对比两次执行结果来验证:
- 单独执行
perf stat -e cache-misses -- ls,记录缓存未命中的数值; - 在另一个终端持续运行高缓存压力的任务(比如
dd if=/dev/zero of=/dev/null bs=1G),再次执行perf stat -e cache-misses -- ls。
两次结果的差异会非常小,说明统计的是ls进程自身的开销,而非全局的缓存未命中。
内容的提问来源于stack exchange,提问作者Changbin Du
相关产品推荐
相关产品推荐

