Огромные страницы для файлов с отображением памяти в Linux

Я хочу использовать Huge Pages с файлами с отображением памяти в Linux 3.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 <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 не используется.

Есть ли способ включить на диске большие страницы с отображенными в память файлами?

Чтобы быть ясным, я ищу способ сделать это на C - я не прошу решения, применимого к существующим исполняемым файлам (тогда вопрос будет относиться к SuperUser).


person John Zwinck    schedule 19.05.2017    source источник
comment
Я пробовал похожие вещи - безуспешно. Если вы найдете решение, поделитесь, пожалуйста :) Кстати: Вы читали этот QA: stackoverflow.com/questions/30470972/ Это не решает мою проблему, но дает ссылку на некоторую документацию по ядру. Я пытался следовать этой документации - все еще безуспешно, но, возможно, вы сможете что-то из этого сделать.   -  person 4386427    schedule 19.05.2017


Ответы (2)


Похоже, что используемая вами файловая система не поддерживает файлы отображения памяти с использованием огромных страниц.

Например, для ext4 эта поддержка все еще находится в стадии разработки по состоянию на январь 2017 г., и еще не включен в ядро ​​(по состоянию на 19 мая 2017 г.).

Если вы запускаете ядро ​​с этим набором исправлений, обратите внимание, что вам нужно включить поддержку огромных страниц в параметрах монтирования файловой системы, например, добавив huge=always в четвертый столбец в /etc/fstab для желаемых файловых систем или используя sudo mount -o remount,huge=always /mountpoint.

person Nominal Animal    schedule 19.05.2017

Здесь возникает путаница: огромные страницы можно использовать через необработанный интерфейс ядра или / и через библиотеку пользовательского пространства (libhugetlbfs) и сопутствующие инструменты (например, hugeadm).

Если вы хотите mmap() область памяти на огромные страницы. Вы используете необработанный интерфейс ядра. Чтобы сделать это, в этом ответе есть рецепт.

Если вы хотите использовать библиотеку пользовательского пространства (libhugetlbfs), обратитесь за помощью к руководства по инструментам и руководство по API.

person Rachid K.    schedule 19.12.2020