透明なhugepages、ページテーブルサイズおよび/proc//ステータス

透明なhugepages、ページテーブルサイズおよび/proc//ステータス

TL; DR;私のページテーブルは、透過的に巨大なページ(THP)を使用するよりもはるかに大きいです。

50GiBのメモリを割り当て、透明なhugepageを要求しましたが失敗するプログラム(下記参照)があります。

パスすると、/proc/meminfo実際に/proc/<pid>/smapsTHPが割り当てられていることを確認できます。

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

大きなページの利点の1つは、ページテーブルが約512倍に減ることです。 4つではなく3つのレベルのみがあり、512のPTEはなく、各PTEのサイズは8バイト(x64から)で、PMD項目は1つだけです。したがって、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;
}

関連情報