【问题标题】:Huge pages for memory mapped files on LinuxLinux 上内存映射文件的大页面
【发布时间】:2017-10-19 00:44:26
【问题描述】:

我想在 Linux 3.13 上将 Huge Pages 与内存映射文件一起使用。

首先,在 Ubuntu 上,我这样做是为了分配 10 个大页面:

sudo apt-get install hugepages
sudo hugeadm --pool-pages-min=2048K:10

然后我运行了这个测试程序:

#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    size_t size = 2 * 1024 * 1024; /* 1 huge page */

    int fd = open("foo.bar", O_RDWR|O_CREAT, 0666);
    assert(fd >= 0);
    int rc = ftruncate(fd, size);
    assert(rc == 0);

    void* hint = 0;
    int flags = MAP_SHARED | MAP_HUGETLB;
    void* data = mmap(hint, size, PROT_READ|PROT_WRITE, flags, fd, 0);
    if (data == MAP_FAILED)
        perror("mmap");
    assert(data != MAP_FAILED);
}

它总是以 EINVAL 失败。如果您将flags 更改为MAP_PRIVATE|MAP_ANONYMOUS,那么它可以工作,但它当然不会向文件写入任何内容。

我也尝试在mmap() 之后使用madvise() 而不使用MAP_HUGETLB

    rc = madvise(data, size, MADV_HUGEPAGE);
    if (rc != 0)
        perror("madvise");
    assert(rc == 0);

如果不使用 MAP_ANONYMOUS,这也会失败 (EINVAL)。

有什么方法可以在磁盘上启用带有内存映射文件的大页面?

需要明确的是,我正在寻找一种在 C 语言中执行此操作的方法——我并不是要求将解决方案应用于现有的可执行文件(那么问题将属于超级用户)。

【问题讨论】:

  • 我一直在尝试类似的东西 - 没有运气。如果您想出解决方案,请分享 :) BTW:您是否阅读过此 QA:stackoverflow.com/questions/30470972/… 它并没有解决我的问题,但它提供了一些内核文档的链接。我尝试遵循该文档-仍然没有任何运气,但也许您可以有所作为。

标签: c linux mmap tlb huge-pages


【解决方案1】:

您使用的底层文件系统似乎不支持使用大页面的内存映射文件。

例如,对于 ext4,此支持仍在开发中as of January 2017,尚未包含在内核中(截至 2017 年 5 月 19 日)。

如果您运行应用了该补丁集的内核,请注意您需要在文件系统挂载选项中启用大页面支持,例如将huge=always 添加到/etc/fstab 的第四列以获取所需的文件系统,或使用sudo mount -o remount,huge=always /mountpoint.

【讨论】:

    【解决方案2】:

    这里有一个混淆:可以通过原始内核接口或/和通过用户空间库 (libhugetlbfs) 和随附工具(例如 hugeadm)来使用大页面。

    如果你想把mmap()一个内存区变成大页。您正在使用“原始内核接口”。为此,answer 中有一个配方。

    如果您想使用用户空间库 (libhugetlbfs),请从 manuals of the toolsmanual of the API 获得帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多