TL; DR;私のページテーブルは、透過的に巨大なページ(THP)を使用するよりもはるかに大きいです。
50GiBのメモリを割り当て、透明なhugepageを要求しましたが失敗するプログラム(下記参照)があります。
パスすると、/proc/meminfo
実際に/proc/<pid>/smaps
THPが割り当てられていることを確認できます。
$ 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;
}