Linux获取CPU缓存命中率

Linux获取CPU缓存命中率

据我所知,很多现代 CPU 都具有内存缓存未命中/命中计数器。

是否有可以查询此问题的 API/程序?是否有办法重置计数器?

我对任何通用或特定 CPU 的程序都感兴趣。

注意:我知道 cachegrind,但那是一个模拟,而不是实际的 CPU 计数器。

答案1

好吧,我又获取了一些资源,看起来对于 CPU 缓存命中/未命中计数器,我们必须进行基于单个进程或 pid 或 tid 的跟踪。换句话说,就是 perf 和 oprofile。

例如 perf stat 给出了这个。

 Performance counter stats for 'ls':

      3.905621 task-clock                #    0.831 CPUs utilized
             1 context-switches          #    0.000 M/sec
             0 CPU-migrations            #    0.000 M/sec
           267 page-faults               #    0.068 M/sec
       379,003 cycles                    #    0.097 GHz                     [24.55%]
     1,332,419 stalled-cycles-frontend   #  351.56% frontend cycles idle    [36.65%]
 <not counted> stalled-cycles-backend
       833,177 instructions              #    2.20  insns per cycle
                                         #    1.60  stalled cycles per insn
       580,745 branches                  #  148.695 M/sec                   [95.65%]
        37,799 branch-misses             #    6.51% of all branches         [71.09%]

   0.004697863 seconds time elapsed

Oprofile 给出了类似的输出,但在我看来,perf 非常棒。

另一件事是,对于存储库,numastat 为您提供了另一个级别的细节。

$ numastat
                       node0
numa_hit                74263001
numa_miss                      0
numa_foreign                   0
interleave_hit             15459
local_node              74263001
other_node                     0

是的,这个系统是一个单节点系统。

答案2

在此问题/答案他们讨论了用于分析缓存未命中的Linux工具:

性能:

$ perf stat ./yourapp
$ perf stat -B dd if=/dev/zero of=/dev/null count=1000000

瓦尔格林:

$ valgrind ./yourapp

而且time从理论上来说,这也计算了页面错误:

$ time -v YourProgram.exe

在我的系统上它不接受-v标志,我必须检查为什么

相关内容