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