透明大页、页表大小和/proc//地位

透明大页、页表大小和/proc//地位

TL;博士;我的页表比使用透明大页 (THP) 时应有的大小要大得多。

我有一个程序(见下文),它分配 50 GiB 内存,请求透明大页面并对其进行故障处理。

通过/proc/meminfo/proc/<pid>/smaps我可以验证THP确实被分配了。

$ cat /proc/meminfo | grep AnonHugePages
AnonHugePages:  52426752 kB

大页的优点之一是页表大约缩小了 512 倍。它只有三级而不是四级,并且没有 512 个 PTE,每个 PTE 大小为 8 字节(在 x64 上),只有一个 PMD 条目。因此,据说每 2MiB 内存可以在 PTE 中节省 512 * 8 = 4 KiB。但是,当我检查 /proc//status 中的页表大小时,它告诉我我有 100MiB 的页面描述符。如果我使用 4 KiB 页面 (50 GiB / 4 KiB * 8 = 100 MiB),那么这是有意义的,但对于 2 MiB 页面,我预计不会有很多 PTE,因此 VmPTE 应该是一些接近于零的小数字。只有使用 PTE 的东西才应该是代码页、堆栈、glibc 等。所有没有用 thp 映射的东西。

buchgra@hyper2:~$ cat /proc/24116/status | egrep "VmPTE|VmPMD"
VmPTE:    102444 kB 
VmPMD:       212 kB

THP 也不会出现在 /proc/24116/numa_maps 等中。

有谁知道为什么?这些统计数据可能不知道 THP 即透明大页面是透明的吗?

谢谢!

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;
}

相关内容