Использование прозрачных огромных страниц (THP) с shm_open и mmap в файле только для чтения в /dev/shmLinux

Ответить Пред. темаСлед. тема
Anonymous
 Использование прозрачных огромных страниц (THP) с shm_open и mmap в файле только для чтения в /dev/shm

Сообщение Anonymous »

У меня есть файл, доступный только для чтения, расположенный в /dev/shm, произвольного размера (не обязательно кратного 2 МБ или меньше 120 КБ). Я хочу использовать shm_open и mmap для отображения этого файла в памяти, а затем использовать madvise с MADV_HUGEPAGE, чтобы предложить использование прозрачных огромных страниц (THP).
Я уже настроил следующие параметры:

Код: Выделить всё

echo advise >/sys/kernel/mm/transparent_hugepage/shmem_enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
Однако, когда я запускаю свое приложение, я замечаю, что процесс не использует огромные страницы. Значение ShmemHugePages в /proc/meminfo остается равным 0.
Вот мой код:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}

const char *file_path = argv[1];
int fd = shm_open(file_path, O_RDONLY, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}

struct stat sb;
if (fstat(fd, &sb) == -1) {
perror("fstat");
close(fd);
exit(EXIT_FAILURE);
}

size_t huge_page_size = sysconf(_SC_HUGEPAGESIZE);
if (huge_page_size == -1) {
perror("sysconf");
close(fd);
exit(EXIT_FAILURE);
}

void *addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
exit(EXIT_FAILURE);
}

// TODO: do something for test

if (madvise(addr, sb.st_size, MADV_HUGEPAGE) == -1) {
perror("madvise");
munmap(addr, sb.st_size);
close(fd);
exit(EXIT_FAILURE);
}

if (sb.st_size > 0) {
char first_byte = *(char *)addr;
printf("Bytes: %02X\n", first_byte);
}

munmap(addr, sb.st_size);
close(fd);

return 0;
}
Шаги по воспроизведению:
Создайте файл в /dev/shm произвольного размера.
Запустите предоставленный код, используя путь к файлу в качестве аргумента.
Проверьте /proc/meminfo, чтобы убедиться, что значение ShmemHugePages больше 0.
Ожидаемое поведение :
Процесс для отображаемого файла следует использовать прозрачные огромные страницы, а ShmemHugePages в /proc/meminfo должно отражать использование.
Фактическое поведение:
Процесс не использует прозрачные огромные страницы, и ShmemHugePages остается 0.
Информация о системе:
Версия ядра Linux: 5.4
ЦП Архитектура: x86_64
Дополнительная информация:
Размер файла не обязательно кратен 2 МБ.
Файл открыт в режиме только для чтения.
Система настроена на использование THP для shmem с политикой рекомендаций.
Вопрос:
Какие дополнительные шаги или настройки необходимы, чтобы гарантировать, что ядро ​​использует прозрачный Огромные страницы для сопоставленного файла в /dev/shm?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ly-file-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»