确定通过malloc()的分配是否由大页面支持

时间:2014-08-26 05:00:24

标签: c++ linux performance x86 huge-pages

我非常了解transparent hugepages的工作方式,以及任何分配,例如malloc执行的分配,都可以通过大页面来满足。

我想知道的是,如果在分配后我可以进行任何检查(可能是启发式),以确定内存是否由大页面支持。

2 个答案:

答案 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