Назад | Перейти на главную страницу

Как ядро ​​Linux решает, когда освобождать страницы, выделенные через mmap?

У меня есть приложение, которое mmaps большая структура данных только для чтения в память и считывает ее части. Через некоторое время около 1 ГБ физической памяти заполняется страницами, загруженными из этой структуры данных. Когда объем свободной памяти на этой машине падает ниже определенного порога (~ 750 МБ или около того), ядро, кажется, освобождает все (или почти все) страницы, загруженные через mmap.

Как ядро ​​решает, когда начинать выгрузку страниц с mmapped? Есть ли способ контролировать этот порог? (например, что-нибудь в /proc/sys/vm или cgroups)

Настроить пороги немного сложно. Для хорошей производительности всегда должен быть некоторый буфер свободной памяти. И лично я не совсем понимаю настройку виртуальной памяти в отношении страниц mmap и анонимных.

Для большего количества рабочего набора в памяти добавьте RAM к хосту. Или, может быть, более быстрая система хранения для чтения частей файла.

В ручном режиме системный вызов munmap () удаляет сопоставления для указанного диапазона адресов, вызывая дальнейшие ссылки на адреса в этом диапазоне для создания недопустимых ссылок на память.

ОБРАБОТКА ГРЯЗНЫХ СТРАНИЦ Как munmap () обрабатывает грязную страницу, зависит от того, какой тип памяти не отображается:

 [Anonymous]        If the memory is anonymous memory and if the last reference is going away, then the contents are discarded by definition of anonymous memory.
 [System V Shared]  If the memory mapping was created using System V shared memory, then the contents persist until the System V memory region is destroyed or the sys-                        tem is rebooted.
 [File mapping]     If the mapping maps data from a file (MAP_SHARED), then the memory will eventually be written back to disk if it's dirty.  This will happen automat-                        ically at some point in the future (implementation dependent).  Note: to force the memory to be written back to the disk, use msync(2).
 If there are still other references to the memory when the munmap is done, then nothing is done to the memory itself and it may be swapped out if need be. The memory
 will continue to persist until the last reference goes away