我想在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