2017-05-19 127 views
0

我想在Linux 3.13上使用内存映射文件的巨大页面。Linux上内存映射文件的巨大页面

要开始,在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,那么它可以正常工作,但它当然不会向该文件写入任何内容。

我也使用madvise()试图mmap()后无MAP_HUGETLB

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

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

有没有办法在磁盘上启用内存映射文件的大页面?

要清楚,我正在寻找一种方法来做到这一点 - 我不是要求解决方案适用于现有的可执行文件(然后问题将属于超级用户)。

+0

我一直在尝试类似的东西 - 没有运气。如果你想出一个解决方案,请分享:)顺便说一句:你看过这个QA:http://stackoverflow.com/questions/30470972/using-mmap-and-madvise-for-huge-pages它没有解决我的问题,但它提供了一些内核文档的链接。我试图遵循这个文档 - 仍然没有任何运气,但也许你可以做些什么。 – 4386427

回答

2

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

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

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