当我们映射一个大文件时,如何控制RSS中的窗口?现在让我解释一下我的意思。
例如,我们有一个超过RAM几倍的大文件,我们为几个进程进行共享内存映射,如果我们访问一些虚拟地址位于此映射内存中的对象并捕获页面错误,那么从磁盘读取,子问题是,如果我们不再使用给定的对象,是否会发生相反的情况?如果这种情况像LRU一样发生,那么LRU的大小是多少,如何控制它?在这种情况下,页面缓存如何参与?
这是测试实例(2个线程,8 GB RAM)上80 GB tar文件的RSS图表。这个3800 MB的值从哪里来,并且在我映射文件后运行时保持稳定?我如何控制它(或建议内核控制它)?
madvise
调用可能是你能做到的最好的。如果你想改变整个系统的分页行为,你可能需要root权限重新配置内核,这种类型的问题更适合在http://serverfault.com上讨论。 - Dan BonacheaMADV_DONTNEED/MADV_FREE
一次来设置某些策略,还是只有当我不需要这些页面时才调用它们? 至于控制 - 我理解我的程序通常有足够的内存,但页缓存占用了太多的内存,并且存储了通常情况下可能不会很快需要的内存。因此,在我的情况下,具有最大缓存大小的 LRU 算法很适合。 - Vladislav MarkovMADV_DONTNEED/MADV_FREE
来释放一系列页面。因此,在您的情况下,程序可以读取前N个页面,然后通过madvise
命令内核来释放这些页面。如果您正在寻找一次性在mmap时间调用的内容,则应该使用MADV_SEQUENTIAL
,它告诉内核为顺序访问调整分页启发式算法。 - Dan Bonachea