2017-05-19 18 views
0

에있는 파일을 매핑. 그것은 항상 EINVAL 실패거대한 페이지는 내가 리눅스 3.13에 메모리 매핑 파일과 거대한 페이지를 사용하려면 리눅스

#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); 
} 

:

sudo apt-get install hugepages 
sudo hugeadm --pool-pages-min=2048K:10 

가 그럼 난이 테스트 프로그램을 실행 :

가 시작하려면, 우분투에 나는이 10 거대한 페이지를 할당했다. 당신이 MAP_PRIVATE|MAP_ANONYMOUSflags을 변경하는 경우 그것은 작동하지만, 물론 그것은 파일에 아무것도 쓰지 않습니다.

는 또한 MAP_HUGETLB없이 mmap()madvise()를 사용하여 시도 : MAP_ANONYMOUS를 사용하지 않을 경우

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

이것은 또한 (EINVAL)를 실패합니다.

디스크에 메모리 매핑 파일이 포함 된 거대한 페이지를 활성화하는 방법이 있습니까?

분명히하기 위해 C에서이 작업을 수행 할 방법을 찾고 있습니다. 기존 실행 파일에 적용 할 솔루션을 요구하지 않았습니다. 그런 다음 질문은 수퍼 유저에 속합니다.

+0

나는 운 좋게도 비슷한 것들을 시도해 왔습니다. 솔루션을 제안한 경우 공유하십시오 :) BTW :이 QA를 읽었습니까? http://stackoverflow.com/questions/30470972/using-mmap-and-madvise-for-huge-pages 해결할 수 없습니다. 내 문제 그러나 일부 커널 문서에 대한 링크를 제공합니다. 나는 그 문서를 따르도록 노력 - 아직 운이없이하지만, 아마도 당신은 그것의 무언가를 만들 수 있습니다. – 4386427

답변

2

사용중인 기본 파일 시스템이 거대한 페이지를 사용하는 메모리 매핑 파일을 지원하지 않는 것 같습니다.

은 (2017 년 5 월 19로) 예를 들어, ext4에 대한 이러한 지원은 개발 as of January 2017에서 아직, 아직 커널에 포함되지 않습니다.

가 적용된이 패치 세트와 커널을 실행하는 경우, 당신은 파일 시스템을 원하는, 또는 sudo mount -o remount,huge=always /mountpoint를 사용 /etc/fstab에서 네 번째 열에 huge=always을 추가하는 예를 들어, 파일 시스템에서 큰 페이지 지원을 활성화해야 마운트 옵션을 참고 않습니다.