我想在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
。
有没有办法在磁盘上启用内存映射文件的大页面?
要清楚,我正在寻找一种方法来做到这一点 - 我不是要求解决方案适用于现有的可执行文件(然后问题将属于超级用户)。
我一直在尝试类似的东西 - 没有运气。如果你想出一个解决方案,请分享:)顺便说一句:你看过这个QA:http://stackoverflow.com/questions/30470972/using-mmap-and-madvise-for-huge-pages它没有解决我的问题,但它提供了一些内核文档的链接。我试图遵循这个文档 - 仍然没有任何运气,但也许你可以做些什么。 – 4386427