使用mmap和madvise进行巨大页面处理

27

我想在Linux机器正在使用的hugepages上分配内存。我看到有两种方法可以做到这一点,一种是使用mmap,另一种是使用madvise

也就是说,在mmap调用中使用MAP_HUGETLB标志-

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);

使用madvise调用时,可以使用MADV_HUGEPAGE标志 -

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);

有人能解释一下这两者之间的区别吗?

2个回答

29

这两个函数执行不同的操作,但在您的情况下可能会或可能不会很重要:

  • madvise 为所有与传递给它的区域对应的内存映射设置一个标志,告诉 khugepaged 内核线程可以考虑将这些映射升级为大页。只有在启用透明大页支持的情况下(透明大页支持的状态在 /sys/kernel/mm/transparent_hugepage/enabled 下可用),这才能起作用。大多数发行版都会启用它,但在嵌入式系统中可能会被禁用。

  • mmap 实际上会从内核的内部 hugetlbfs 挂载中保留页面,其状态可以在 /sys/kernel/mm/hugepages 下查看。所需的页面需要在调用 mmap 之前可用(请参见 /proc/meminfo 中的 HugePages_Free),否则 mmap 将失败。

这两种机制都有自己的文档文件: hugetlbpage.txttranshuge.txt


所以,如果有足够的页面可用... mmap 是更可靠的选择?这是正确的吗? - ssb
8
视情况而定。如果您完全掌控了机器上的一切,并且准确了解程序的行为方式,则mmap可以让您指定其行为。如果您不确定内存将如何使用(是否会出现碎片?系统中是否有其他大页面用户),则透明大页最终会给您带来最佳结果。 - Frederik Deweerdt
3
madvise 只适用于私有匿名映射。 - makerj

2

mmap 用于显式巨页,而 madvise 用于透明巨页。这是在 Linux 上使用大页面的两种方式。虽然显式巨页会预留虚拟内存,但透明巨页则不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接