当Map一个大文件时,我们如何控制RSS中的窗口?现在让我来解释一下我的意思。例如,我们有一个大文件,超过RAM的几倍,我们为几个进程做共享内存Map,如果我们访问某个对象,其虚拟地址位于这个Map的内存中,并捕捉到一个页面错误,然后从磁盘阅读,子问题是,如果我们不再使用给定的对象,会发生相反的情况吗?2如果这种情况像LRU一样发生,那么LRU的大小是多少?3如何控制它?4在这种情况下,页面缓存是如何参与的?
RSS graph
这是80 GB tar文件的测试示例(2个线程,8 GB RAM)的RSS图。这个3800 MB的值是从哪里来的,并且在Map后运行文件时保持稳定?我如何控制它(或者建议内核控制它)?
1条答案
按热度按时间2ic8powd1#
只要你没有采取明确的行动来锁定内存中的页面,它们最终应该会被自动换出。内核基本上使用内存压力启发式来决定多少物理内存用于换入的页面,并根据需要频繁地重新平衡。
如果您想在控制此过程中扮演更积极的角色,请查看
madvise()
system call。这允许您调整mmap的分页算法,操作如下:
MADV_FREE
(自Linux 4.5起)MADV_COLD
(自Linux 5.4起)MADV_SEQUENTIAL
MADV_WILLNEED
MADV_DONTNEED
创建
mmap
后发出madvise(MADV_SEQUENTIAL)
可能足以获得可接受的行为。如果不能,您还可以在遍历过程中传递页组时散布一些MADV_WILLNEED
/MADV_DONTNEED
访问提示(和/或MADV_FREE
/MADV_COLD
)。