2

I want to use Huge Pages with memory-mapped files on Linux 3.13.

To get started, on Ubuntu I did this to allocate 10 huge pages:

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

Then I ran this test program:

#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);
}

It always fails with EINVAL. If you change flags to MAP_PRIVATE|MAP_ANONYMOUS then it works, but of course it won't write anything to the file.

I also tried using madvise() after mmap() without MAP_HUGETLB:

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

This also fails (EINVAL) if MAP_ANONYMOUS is not used.

Is there any way to enable huge pages with memory-mapped files on disk?

To be clear, I am looking for a way to do this in C--I'm not asking for a solution to apply to existing executables (then the question would belong on SuperUser).

4

2 回答 2

4

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

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

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

于 2017-05-19T15:33:59.897 回答
0

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

如果你想把mmap()一个内存区变成大页。您正在使用“原始内核接口”。为了做到这一点,这个答案中有一个食谱。

如果您想使用用户空间库 ( libhugetlbfs ),请从工具手册和 API 手册中获取帮助

于 2020-12-19T21:00:39.020 回答