我非常了解transparent hugepages的工作方式,以及任何分配,例如malloc
执行的分配,都可以通过大页面来满足。
我想知道的是,如果在分配后我可以进行任何检查(可能是启发式),以确定内存是否由大页面支持。
答案 0 :(得分:1)
您可以通过查找" pfn"来确定任何页面的确切状态,包括它是否由透明(或非透明)巨页支持。 /proc/kpageflags
文件中的(页面帧编号)。您可以通过读取进程的/proc/$PID/pagemap
文件来获取页面的pfn,该文件由虚拟地址编制索引。
不幸的是,来自pfn
1 的pagemap
值和整个/proc/kpageflags
文件只能由root用户访问。如果你可以至少在你感兴趣的测试或基准测试场景中以root身份运行你的流程,那么这很有效。
我写了一个small library called page-info,它为你做了相关的解析。给它一个内存范围,它会在每个页面上返回信息,包括它是否存在于内存中,由大页面支持等。
例如,以sudo ./page-info-test THP
运行包含的测试流程会得到以下输出:
PAGE_SIZE = 4096, PID = 18868
size memset FLAG SET UNSET UNAVAIL
0.25 MiB BEFORE THP 0 1 64
0.25 MiB AFTER THP 0 65 0
0.50 MiB BEFORE THP 0 1 128
0.50 MiB AFTER THP 0 129 0
1.00 MiB BEFORE THP 0 1 256
1.00 MiB AFTER THP 0 257 0
2.00 MiB BEFORE THP 0 1 512
2.00 MiB AFTER THP 0 513 0
4.00 MiB BEFORE THP 0 1 1024
4.00 MiB AFTER THP 512 513 0
8.00 MiB BEFORE THP 0 1 2048
8.00 MiB AFTER THP 1536 513 0
16.00 MiB BEFORE THP 0 1 4096
16.00 MiB AFTER THP 3584 513 0
32.00 MiB BEFORE THP 0 1 8192
32.00 MiB AFTER THP 7680 513 0
64.00 MiB BEFORE THP 0 1 16384
64.00 MiB AFTER THP 15872 513 0
128.00 MiB BEFORE THP 0 1 32768
128.00 MiB AFTER THP 32256 513 0
256.00 MiB BEFORE THP 0 1 65536
256.00 MiB AFTER THP 65024 513 0
512.00 MiB BEFORE THP 0 1 131072
512.00 MiB AFTER THP 124416 6657 0
1024.00 MiB BEFORE THP 0 1 262144
1024.00 MiB AFTER THP 0 262145 0
DONE
UNAVAIL
列表示没有关于映射的信息可用 - 通常是因为该页面从未被访问过,因此根本没有任何页面支持。你可以看到,对于这些"大的"分配后,只有一个页面被映射,因为我们还没有触及内存。
在整个分配上调用AFTER
后,memset()
行是相同的信息,这会导致所有页面都被物理分配。在这里,我们可以看到没有分配由透明大页面支持,直到我们达到4 MiB的分配,此时每个分配的大部分由THP支持,除了513页(结果是在分配区域的边缘) )。在512 MiB时,系统开始耗尽可用的大页面,但仍然满足大部分分配,但在1024 MiB时,整个分配满足小页面。
此库尚未准备就绪,因此不要将其用于任何关键事项(例如,某些故障只需调用exit()
)。欢迎捐款。
1 从内核4.0开始,在此之前,非root用户进程可以访问pfn。从4.0到4.1左右,整个pagemap
是非root进程的禁区,但从那以后文件再次可用但是pfn被屏蔽掉(它总是显示为零)。
答案 1 :(得分:-1)
传统的大页面和透明的大页面(THP)之间存在差异。在THP的情况下,应用程序可以使用大页面而无需任何开发人员支持(mmap,shmget等)或sys-admin干预。
在代码中,恐怕可能没有直接检查这个。但是,如果您知道sizeof()已分配的数据结构或缓冲区,则值得使用以下命令进行grepping并检查系统上的THP使用情况。运行应用程序时,此用法应该会增加:
# grep AnonHugePages /proc/meminfo
AnonHugePages: 2648064 kB