Освобождение памяти mmap в Linux с помощью модуля mmap на Python

#python #python-3.x #shared-memory #mmap

#python #python-3.x #разделяемая память #mmap

Вопрос:

Я использую модуль mmap pythons для совместного использования памяти между набором процессов. Общие данные составляют сотни ГБ и не все сразу помещаются в память, при этом я хотел бы иметь возможность освободить некоторые области памяти после того, как я закончу с ними работать.

Насколько я понимаю, я могу освободить память в OSX с помощью следующего кода. Который, похоже, работает.

 data_size = 10
data_start = 0
self.data = mmap.mmap(-1, 20)
self.data.seek(data_start)
self.data.write('0000000000')
self.data.madvise(mmap.MADV_FREE, data_start, data_size)
 

Однако MMADV_FREE, похоже, недоступен в redhat, и единственной подобной константой, которую я вижу доступной в redhat, является MMADV_REMOVE. Но всякий раз, когда я пытаюсь использовать эту константу, я получаю ошибку ОС.

 # Let the OS know that these pages are no longer in use and can be freed
>       self.data.madvise(mmap.MADV_REMOVE, data_start, data_size)
E       OSError: [Errno 22] Invalid argument
 

Это правильный способ освободить память из mmap, выделенного в Python, или я что-то упускаю?

Версия Redhat: Red Hat Enterprise Linux Server версии 7.8 (Maipo)

Версия ядра:

  #uname -r 
 4.14.35-2025.400.9.el7uek.x86_64

 #uname -mrs
 Linux 4.14.35-2025.400.9.el7uek.x86_64 x86_64
 

заголовки madvise

 /* Advice to `madvise'.  */
#ifdef __USE_BSD
# define MADV_NORMAL      0 /* No further special treatment.  */
# define MADV_RANDOM      1 /* Expect random page references.  */
# define MADV_SEQUENTIAL  2 /* Expect sequential page references.  */
# define MADV_WILLNEED    3 /* Will need these pages.  */
# define MADV_DONTNEED    4 /* Don't need these pages.  */
# define MADV_REMOVE      9 /* Remove these pages and resources.  */
# define MADV_DONTFORK    10    /* Do not inherit across fork.  */
# define MADV_DOFORK      11    /* Do inherit across fork.  */
# define MADV_MERGEABLE   12    /* KSM may merge identical pages.  */
# define MADV_UNMERGEABLE 13    /* KSM may not merge identical pages.  */
# define MADV_HUGEPAGE    14    /* Worth backing with hugepages.  */
# define MADV_NOHUGEPAGE  15    /* Not worth backing with hugepages.  */
# define MADV_DONTDUMP    16    /* Explicity exclude from the core dump,
                                   overrides the coredump filter bits.  */
# define MADV_DODUMP      17    /* Clear the MADV_DONTDUMP flag.  */
# define MADV_HWPOISON    100   /* Poison a page for testing.  */
#endif
 

Версия Glibc

glibc-headers-2.17-307.0.1.el7.1.x86_64

Решение Итак, как выясняется, в Linux любые аргументы, передаваемые madvise с MADV_REMOVE помощью, должны быть выровнены по странице. Вот почему это выдавало мне ошибку. Выравнивание аргументов по страницам размером 4 КБ устранило проблему.

Комментарии:

1. На какой версии RHEL вы пытаетесь запустить это?

2. @HTF Не имеет значения, есть ли константы. Red Hat предоставляет ядро, и ядро также должно его поддерживать.

3. Можете ли вы использовать MADV_DONTNEED вместо MADV_FREE ?

4. Вместо этого я попробовал MADV_DONTNEED и, к сожалению, получил аналогичную ошибку.

5. Я обновил сообщение версией redhat