TL;DR;내 페이지 테이블은 THP(Transparent Huge Pages)를 사용해야 하는 것보다 훨씬 큽니다.
50GiB의 메모리를 할당하고 투명한 hugepage를 요청했지만 실패하는 프로그램(아래 참조)이 있습니다.
Pass 하면 /proc/meminfo
실제로 /proc/<pid>/smaps
THP가 할당된 것을 확인할 수 있습니다.
$ cat /proc/meminfo | grep AnonHugePages
AnonHugePages: 52426752 kB
대형 페이지의 장점 중 하나는 페이지 테이블이 약 512배로 줄어든다는 점입니다. 4개가 아닌 3개의 레벨만 있고 512개의 PTE가 없으며 각 PTE의 크기는 8바이트(x64에서)이며 PMD 항목이 하나만 있습니다. 따라서 PTE에서는 메모리 2MiB당 512 * 8 = 4KiB가 절약된다고 합니다. 그러나 /proc//status에서 페이지 테이블 크기를 확인하면 페이지 설명자가 100MiB라고 표시됩니다. 4KiB 페이지(50GiB / 4KiB * 8 = 100MiB)를 사용하는 경우 이는 의미가 있지만 2MiB 페이지에서는 많은 PTE를 기대하지 않으므로 VmPTE는 다음과 같은 작은 페이지여야 합니다. 숫자가 0입니다. PTE를 사용하는 유일한 것은 코드 페이지, 스택, glibc 등이어야 합니다. thp로 매핑되지 않은 모든 것.
buchgra@hyper2:~$ cat /proc/24116/status | egrep "VmPTE|VmPMD"
VmPTE: 102444 kB
VmPMD: 212 kB
THP는 /proc/24116/numa_maps 등에 나타나지 않습니다.
이유를 아는 사람 있나요? 이러한 통계는 THP를 인식하지 못할 수 있습니다. 즉, Transparent Huge Pages는 투명합니까?
감사해요!
int main(int argc, char** argv) {
constexpr size_t SIZE_50GiB = 50ull << 30;
void *p = mmap(NULL, SIZE_50GiB, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
madvise(p, SIZE_50GiB, MADV_HUGEPAGE);
memset(p, 1, SIZE_50GiB);
printf("pid: %d\n", getpid());
sleep(10000);
return 0;
}