如何在ubuntu中分析TLB命中和TLB未命中

时间:2012-02-15 18:14:33

标签: c++ performance linux-kernel monitoring

我编写了一个简单的C ++程序,使用for-loop打印从1到100的数字。我想找到运行时特定程序发生的TLB命中和未命中数。有没有可能获得这些数据?

我正在使用Ubuntu。我用过perf工具。但它在不同的时间产生不同的结果。我很困惑我的代码的哪一部分导致如此巨大的TLB命中,TLB未命中和缓存未命中。

当然,可能还有其他进程同时运行,如Ubuntu GUI。但是,这个结果是否包括这些过程呢? 我使用的命令:perf stat -e dTLB-loads -e'./hellocc'的dTPerformance计数器统计信息:

结果:第一次 -

       909,822 dTLB-loads                                                  
         2,023 dTLB-misses               #    0.22% of all dTLB cache hits 
         4,512 cache-misses                                                

   0.006821182 seconds time elapsed

LB-miss ./hellocc

结果:第二次 - './hellocc'的性能计数器统计信息:

       907,810 dTLB-loads                                                  
         2,045 dTLB-misses               #    0.23% of all dTLB cache hits 
         4,533 cache-misses                                                

   0.006780635 seconds time elapsed

我的简单代码:

#include <iostream>    
using namespace std;    
int main
{    
    cout << "hello" << "\n";    
    for(int i=1; i <= 100; i = i + 1)    
        cout<< i << "\t" ;    
    return 0;    
}

2 个答案:

答案 0 :(得分:4)

你可以模拟这种方法的一种方法是使用cachegrind,这是valgrind的一部分。

  

Cachegrind模拟程序与机器的缓存层次结构和(可选)分支预测器的交互方式。它模拟具有独立的第一级指令和数据缓存(I1和D1)的机器,由统一的二级缓存(L2)支持。这与许多现代机器的配置完全匹配。

虽然这不是你的硬件,我认为你无法达到,但这是一个很好的替身。

答案 1 :(得分:2)

程序的缓存行为取决于当时系统上还发生了什么。

在Linux系统上运行许多进程,例如X服务器和窗口管理器,终端,编辑器,各种守护程序进程以及您运行的任何其他进程(例如Web浏览器)。

根据调度程序的变幻莫测以及这些其他程序对系统的要求,程序的数据可能会或可能不会保留在缓存中(调度程序甚至可能将您的进程完全分页到交换文件中),因此编号缓存未命中数将根据其他正在运行的应用程序而有所不同。