Páginas enormes e transparentes, tamanho pagável e / proc / pid / status

2

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;
}
    
por buchgr 10.02.2016 / 20:33

0 respostas