2017-11-29 15 views
1

나는 perf를 사용하여 페이지 오류 및 tlb miss를 테스트하는 간단한 프로그램을 작성했습니다. 코드는 다음과 같습니다. 순차적으로 1GB 데이터를 쓰고 1GB/4KB = 256K tlb 누락 및 페이지 오류를 트리거하려면 이 필요합니다.페이지 결함 및 tlb 미스에 대해 Linux perf가 부정확합니까?

#include<stdio.h> 
#include <stdlib.h> 

#define STEP 64 
#define LENGTH (1024*1024*1024) 
int main(){ 
    char* a = malloc(LENGTH); 
    int i; 
    for(i=0; i<LENGTH; i+=STEP){ 
      a[i] = 'a'; 
    } 

    return 0; 
} 

그러나, 결과는 다음과 예상보다 훨씬 작은 같습니다. perf가 그렇게 부정확합니까? 누구든지 자신의 컴퓨터에서 코드를 실행할 수 있다면 매우 감사하겠습니다.

$ perf stat -e dTLB-load-misses,page-faults ./a.out 

    Performance counter stats for './a.out': 

     12299  dTLB-load-misses 
      1070  page-faults 

    0.427970453 seconds time elapsed 

환경 : Ubuntu 14.04.5 LTS, 커널 4.4.0; gcc 4.8.4 glibc 2.19. 컴파일 플래그가 없습니다.

CPU는 Intel (R) Xeon (R) CPU E5-2640 v2 @ 2.00GHz입니다.

+0

투명한 거대한 페이지를 사용하도록 설정 했습니까? 이것은 낮은 TLB로드 미스의 원인이 될 수 있습니다. – andrjas

+0

아니요 사실, 거대한 페이지를 사용하고 싶었지만 도움이되지 않는 분수령을 사용했기 때문에 프로필을 작성한 결과 4KB 페이지가 이미 잘 작동한다는 것을 알았습니다. –

+0

프로그램에서 텍스트 출력을 복사하여 캡쳐 화면 대신 여기에 붙여 넣는 것이 좋습니다. 그리고 당신은 [C에서 malloc의 결과를 캐스팅 할 필요가 없습니다] (https://stackoverflow.com/q/605845/995714) –

답변

0

커널은 적어도 패턴의 증거가있는 결함의 페이지를 프리 페치합니다. 알고리즘에 대한 정확한 참조를 찾을 수 없지만, 무엇이 진행되고 있는지보기위한 출발점은 아마도 https://github.com/torvalds/linux/blob/master/mm/readahead.c입니다. 이 메커니즘의 동작을 캡처하는 다른 성능 카운터를 찾습니다.