Linux 内核如何决定何时释放通过 mmap 分配的页面?

Linux 内核如何决定何时释放通过 mmap 分配的页面?

我有一个应用程序将mmap大型只读数据结构放入内存并读取其中的部分内容。一段时间后,大约 1 GB 的物理内存被从此数据结构加载的页面填满。当该机器上的可用内存量低于某个阈值(约 750 MB 左右)时,内核似乎会释放通过加载的所有(或几乎所有)页面mmap

内核如何决定何时开始卸载 mmapped 页面?有没有办法控制该阈值?(例如/proc/sys/vm或中的任何内容cgroups

答案1

从手册来看,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

答案2

调整阈值有点棘手。为了获得良好的性能,总是需要一些空闲内存缓冲区。就我个人而言,我并不完全理解 mmap 页面与匿名页面之间的虚拟内存调整。

为了在内存中存储更多的工作集,请向主机添加 RAM。或者可能是更快的存储系统,以读取文件的各个部分。

答案3

我认为每个 ed 区域没有单独的控件mmap:当内核决定需要更多内存时,某些页面将被“交换出去”。但由于现在没有人再使用交换,因此唯一可以安全释放的页面是文件系统缓冲区缓存中的页面(文件从中被mmaped,但也只是缓存,因为当进程需要文件时,它已经在内存中了)。我认为选择释放哪些页面的启发式方法并不关心哪些页面被映射或没有映射,而只关心它在不久的将来是否需要。

您可以做的是mlock()您不想让内核释放的页面,以便它们永远不会被“换出”。

相关内容