TL; DR; Minha pagetable é muito maior do que deveria quando se usa páginas enormes e transparentes (THP).
Eu tenho um programa (veja abaixo), que aloca 50 GiB de memória, solicita páginas enormes transparentes e as falha.
Por meio de /proc/meminfo
e /proc/<pid>/smaps
, posso verificar se o THP está realmente alocado.
$ cat /proc/meminfo | grep AnonHugePages
AnonHugePages: 52426752 kB
Uma vantagem de páginas enormes é que a pagetable fica menor, aproximadamente, 512 vezes. São apenas três níveis em vez de quatro e, em vez de 512 PTEs com 8 bytes cada (em x64), há apenas uma entrada PMD. Então, supostamente, economiza 512 * 8 = 4 KiB em PTEs por 2 MiB de memória. No entanto, quando eu verifico o tamanho da pagetable em / proc // status, ele me diz que eu tenho 100MiB de descritores de página. Isso faria sentido se eu estivesse usando 4 páginas KiB (50 GiB / 4 KiB * 8 = 100 MiB), mas com 2 MiB páginas eu esperaria que não houvesse muitos PTEs e então VmPTE deveria ser um número pequeno próximo de zero. Somente coisas usando PTEs devem ser páginas de códigos, stack, glibc, etc. Tudo que não está mapeado com thp.
buchgra@hyper2:~$ cat /proc/24116/status | egrep "VmPTE|VmPMD"
VmPTE: 102444 kB
VmPMD: 212 kB
O THP também não aparece em / proc / 24116 / numa_maps e assim por diante.
Alguém sabe por quê? Essas estatísticas talvez não estejam cientes do THP, ou seja, as páginas enormes e transparentes são transparentes?
Obrigado!
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;
}
Tags virtual-memory