C Linux上内存映射文件的巨大页面
我想在Linux3.13上使用带有内存映射文件的巨大页面 首先,在Ubuntu上,我分配了10个巨大的页面:C Linux上内存映射文件的巨大页面,c,linux,mmap,tlb,huge-pages,C,Linux,Mmap,Tlb,Huge Pages,我想在Linux3.13上使用带有内存映射文件的巨大页面 首先,在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
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);
}
如果未使用MAP\u ANONYMOUS
,此操作也会失败(EINVAL
)
有没有办法启用磁盘上带有内存映射文件的大型页面?
明确地说,我正在寻找一种在C中实现这一点的方法——我不是在要求一种解决方案来应用于现有的可执行文件(那么问题就属于超级用户了)。看起来您使用的底层文件系统不支持使用大页面的内存映射文件 例如,对于ext4,此支持仍在开发中,尚未包含在内核中(截至2017年5月19日)
如果您运行应用了该补丁集的内核,请注意,您需要在文件系统装载选项中启用巨大页面支持,例如,为所需的文件系统在
/etc/fstab
中的第四列添加巨大=始终
,或者使用sudo mount-o重新装载,巨大=始终/mountpoint
这里有一个困惑:巨大的页面可以通过原始内核界面或/或通过用户空间库(libhugetlbfs)和附带的工具(例如hugeadm
)使用
如果您想mmap()
将内存区域划分为巨大的页面。您正在使用“原始内核接口”。要做到这一点,这里有一个食谱
如果您想使用用户空间库(libhugetlbfs),请从和获得帮助。我一直在尝试类似的东西,但运气不好。如果你提出了一个解决方案,请分享:)顺便说一句:你读过这个QA吗:它不能解决我的问题,但它提供了一些内核文档的链接。我试着按照那个文档来做——仍然没有任何运气,但也许你能有所收获。
rc = madvise(data, size, MADV_HUGEPAGE);
if (rc != 0)
perror("madvise");
assert(rc == 0);