2010-05-20 4 views
18

최신 x86 CPU는 레거시 4K (예 : 2MB 또는 4MB)보다 큰 페이지 크기를 지원할 수 있으며이 기능에 액세스하기위한 OS 기능 (Linux, Windows)이 있습니다.어떤 상황에서 대형 페이지가 빠른 속도를 낼 수 있습니까?

위의 Microsoft 링크는 큰 페이지가 "자주 사용하는 메모리의 성능을 향상시킬 수있는 번역 버퍼의 효율성을 높입니다"라고 말합니다. 대형 페이지가 주어진 상황을 개선 할 것인지 여부를 예측하는 데별로 도움이되지 않습니다. 나는 거대한 페이지를 사용하기 위해 일부 프로그램 로직 (또는 전체 어플리케이션)을 움직이는 것이 약간의 성능 향상을 가져 오는 콘크리트, 바람직하게는 계량화 된 예제에 관심이있다. 누구든지 성공 사례가 있습니까?

myself에 대한 특별한 사례가 있습니다. 거대한 페이지를 사용하여 dramatically은 대용량 프로세스를 포크하는 데 필요한 시간을 줄일 수 있습니다 (아마도 복사가 필요한 TLB 레코드의 수는 1000 단위로 줄어 듭니다). 거대한 페이지가 덜 이국적인 시나리오에서도 이익이되는지 여부에 관심이 있습니다.

답변

10

큰 페이지에서 가능한 이익을 검사하기 위해 4k 페이지로 TLB의 스 래싱을 극대화 할 수있는 코드를 고안하려고했습니다. 아래 내용은 libhugetlbfs의 malloc (Intel i7, 64bit 데비안 레니)에서 2MByte 페이지를 제공 할 때 이 2.6 배 빠름 (4K 페이지 이상); 잘만되면 명백한 무엇 scoped_timerrandom0n는한다.

volatile char force_result; 

    const size_t mb=512; 
    const size_t stride=4096; 
    std::vector<char> src(mb<<20,0xff); 
    std::vector<size_t> idx; 
    for (size_t i=0;i<src.size();i+=stride) idx.push_back(i); 
    random0n r0n(/*seed=*/23); 
    std::random_shuffle(idx.begin(),idx.end(),r0n); 

    { 
    scoped_timer t 
     ("TLB thrash random",mb/static_cast<float>(stride),"MegaAccess"); 
    char hash=0; 
    for (size_t i=0;i<idx.size();++i) 
     hash=(hash^src[idx[i]]); 
    force_result=hash; 
    } 

단지 hash=hash^src[i]있는 간단한 "직선"버전은 대형 페이지에서 16 %를 얻었지만, (야생 추측) 인텔의 fancy prefetching hardware은 액세스가 (예측되는 4K의 경우 도움이 될 수 있습니다 내가 조사 할 disable prefetching을 할 수 있다고 가정 그것이 사실인지 아닌지).

+2

하드웨어 프리 페칭은 4k 페이지 경계를 넘지 않지만 직선으로 볼 수있는 것은 페이지 테이블 액세스가 매우 예측 가능하기 때문에 TLB에 놓친 페이지 방문이 발생할 가능성이있는 페이지 방문입니다. 모두 L1에 있습니다 (이 페이지 항목은 실제로 프리 페치를 통해 가져온 것일 수 있음). – BeeOnRope

3

일부 HPC/Grid 시나리오 - 특히 RAM이 많은 컴퓨터에서 매우 큰 모델을 가진 물리 패키지가 개선되었습니다. 또한 모델을 실행하는 프로세스가 시스템에서 유일하게 활성화되었습니다. 필자는 측정하지는 못했지만 특정 DB 기능 (예 : 대량 수입)이 이익이 될 것으로 생각합니다.

개인적으로 매우 잘 프로파일 링 된/이해 된 메모리 액세스 프로필이없고 많은 양의 큰 메모리 액세스를 수행하지 않으면 상당한 개선이 이루어질 것 같지 않습니다.

2

큰 프로세스를 실행하는 많은 메모리 (> = 64GB)가있는 서버에서 ~ 5 %의 속도 향상을 얻습니다. 예 : 16GB 자바 프로세스의 경우 4M x 4KB 페이지이지만 4KB x 4MB 페이지 만 제공됩니다.

14

큰 메모리 영역에 광범위하게 간격을 둔 임의 액세스를 수행 할 때 성능에서 가장 큰 차이가 발생합니다. "큰"은 작은 영역의 모든 작은 페이지 항목으로 매핑 할 수있는 범위보다 훨씬 큰 의미입니다. TLB (일반적으로 현대 프로세서에서 여러 레벨을 가짐).

더 복잡한 작업을 수행하기 위해 4KB 페이지의 TLB 항목 수는 2MB 페이지의 항목 수보다 많지만 프로세서에 따라 많이 다릅니다. 레벨 2 TLB에서 얼마나 많은 "대형 페이지"항목을 사용할 수 있는지에 많은 차이가 있습니다.예를 들어

, AMD의 옵테론 가족 10H 개정 D ("이스탄불") 시스템, CPUID 보고서에 :

  • L1 DTLB : 4kB의 페이지 : 48 개 항목; 2MB 페이지 : 48 개 항목; 1GB 페이지 : 48 개 항목
  • L2 TLB : 4KB 페이지 : 512 항목; 2MB 페이지 : 128 항목; 기가 바이트 페이지 : 16 개 항목

동안 인텔 제온 56xx ("웨스트 미어 (Westmere)") 시스템에서, CPUID 보고서 :

  • L1 DTLB : 4kB의 페이지 : 64 개 항목; 2MB 페이지 : 32 항목
  • L2 TLB : 4kB 페이지 : 512 항목; 2 메가 바이트 페이지 : 없음

모두 웨스트 미어 시스템이 32 개 2메가바이트 TLB 항목을 사용하여 64MB의 매핑 할 수 있습니다 및 AMD 시스템 사용 352메가바이트를 매핑 할 수 있지만, 레벨 TLB 미스이 고통을하기 전에 작은 페이지를 사용 2메가바이트 (512 * 킬로바이트)를 매핑 할 수 있습니다 L1 및 L2 TLB에있는 176 개의 2MB TLB 항목 두 시스템 모두 2MB보다 크고 64MB보다 작은 메모리 범위에서 무작위로 액세스 할 수 있도록 대형 페이지를 사용하여 속도가 크게 향상됩니다. AMD 시스템은 훨씬 더 큰 메모리 범위를 위해 대형 페이지를 사용하여 우수한 성능을 계속 나타내야합니다.

이러한 모든 경우에 피하려고하는 것은 x86_64 계층 구조 주소 변환의 네 가지 수준을 모두 통과하는 최악의 경우입니다 (참고 1).
주소 변환 캐시 메커니즘 중 누구도 일 (주 2 없음) 경우, 필요 4KB의 페이지에 매핑 된 데이터를로드 메모리에

  • 5 여행, 메모리
  • 4 여행에 매핑 된 데이터를로드 할 수 2MB 페이지 및
  • 1GB 페이지에 매핑 된 데이터를로드하기 위해 메모리를 3 번 ​​트립합니다.

각각의 경우에 메모리로의 마지막 이동은 요청 된 데이터를 얻는 것이고, 다른 이동은 페이지 변환 정보의 다양한 부분을 얻는 것이 요구된다. 내가 본 가장 좋은 설명은 AMD의의 5.3 절에 위의 그림은 정말 최악의를 구분하지 않습니다 "AMD64 아키텍처 프로그래머의 설명서 제 2 권 : 시스템 프로그래밍"(출판 24,593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf

주 1. 가상 컴퓨터에서 실행하면이 숫자가 더 나 빠지게됩니다. 페이지 테이블의 다양한 레벨을 유지하는 메모리가 디스크로 스왑되도록하는 환경에서 실행하면 성능이 으로 악화됩니다.

참고 2 : 불행히도 모든 현대 프로세서에는 페이지 변환 계층의 상위 수준에 대한 추가 캐시가 있기 때문에이 수준의 수준을 알면 충분하지 않습니다. 내가 알 수있는 한, 이것들은 공개적으로 잘 기록되어 있지 않습니다.

3

이것은 점점 복잡해지고 있지만, 거대한 TLB 페이지는 DMA 메모리 전송 (PCIe를 통해 호스트에서 Phi로)을 수행 할 때 Intel Xeon Phi (MIC) 아키텍처에서 중요한 차이를 만듭니다. This Intel link describes how to enable huge pages. 정상적인 TLB 페이지 크기 (4K)로 성능을 감소시키기 시작한 8MB 이상으로 DMA 전송 크기가 증가하는 것을 발견했습니다. 전송 크기가 512MB에 도달하면 약 3GB/s에서 1GB/s 미만으로 성능이 저하되었습니다.

거대한 TLB 페이지 (2MB)를 활성화하면 512MB의 DMA 전송에 대해 데이터 속도가 5GB/s 이상으로 계속 증가합니다.

관련 문제