mmap映射页是否始终可回收?文件页防驱逐及mlock有效性咨询
mmap文件映射页的内存驻留与缺页问题解答
1. 禁用swap后,预加载完成的映射页是否不会触发major fault、不会被驱逐?
- 不行,别想当然。即使禁用了swap、完成了预加载,后续访问还是可能出现major fault,文件后备页也可能被内核驱逐。因为Linux内核的页回收机制不只是管swap相关的匿名页,只读的文件映射页也在回收范围内——当系统内存吃紧时,内核会优先回收这类“干净”的文件页(毕竟需要的时候可以直接从原文件重新加载,不用写回数据),跟swap开没开没关系。
2. 怎么防止文件后备页被驱逐?
mlock()系统调用或者mmap()时加MAP_LOCKED标志完全有效。这俩操作都会把指定的内存区域钉死在物理内存里,内核不能回收这些页,自然也就不会再有major fault。- 注意:用这俩方法需要
CAP_IPC_LOCK权限,而且锁定的内存总量不能超系统限制,你可以查看/proc/sys/vm/max_lockable_memory的值调整。 - 两者区别不大:
MAP_LOCKED是在mmap创建映射时直接锁定,mlock()是给已经映射好的内存区域加锁,最终效果一致。
- 注意:用这俩方法需要
3. swapoff对文件后备页有啥影响?
swapoff -a只针对匿名页生效,也就是禁止匿名页被交换到swap分区,但对文件后备页的回收逻辑没有任何影响。内核该回收还是会回收只读文件页,因为这些页的内容有原文件做备份,根本不需要依赖swap。
内容的提问来源于stack exchange,提问作者song xs
相关产品推荐
相关产品推荐

