2017-05-19 74 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第四列。