在Linux中,内存回收是什么?

6

我是一个对Linux内存管理非常陌生的人。在阅读一些相关文档时,我有一些基本问题。

以下是我的配置:

vm.swappiness=10
vm.vfs_cache_pressure=140
vm.min_free_kbytes=2013265 

我的理解是,如果可用内存低于vm.min_free_kbytes,那么操作系统将回收内存。

  1. 内存回收是删除不需要的文件还是从RAM复制到Swap内存?

  2. 答:内存回收是指从RAM复制到Swap内存。
  3. 如果我没有使用Swap内存,会发生什么?

  4. 答:如果您没有使用Swap内存,则不会进行复制操作。
  5. swappiness是否总是大于vm.min_free_kbytes

  6. 答:swappiness并不总是大于vm.min_free_kbytes
  7. vm.vfs_cache_pressure的意义是什么?

  8. 答: vm.vfs_cache_pressure参数控制VFS inode和dentry缓存所占用的内存比例。它的值越高,表示更多地释放内存给pagecache,而减少inode和dentry缓存所占用的内存。
1个回答

11
  1. 内存回收是一种机制,通过将其中的数据移动到其他地方来创建更多的可用RAM页面。它与文件无关。当需要更多的RAM时,数据会从RAM中删除(如果可以重新获取,则被丢弃),或者复制到交换文件中(以便数据可以被重新获取)。

  2. 如果没有交换文件,但某些数据应保存到(不存在的)交换区域,则会发生内存不足错误。通常,这会通知试图获取内存的进程(通过alloc()等)- alloc()失败并返回NULL。进程可以选择要做什么,甚至崩溃。如果内核本身需要内存(通常很少),则会发生PANIC,并完全锁定系统。

  3. swappiness是一个百分比,表示内核使用交换空间的倾向,即使不是严格需要,也要准备好大量的RAM以响应内存请求。简单地说,100%的swappiness意味着内核尝试始终进行交换,而swappiness为0意味着内核尝试不进行交换(但有一些特殊值)。min_free_kbytes表示实际的千字节,它不是百分比,应始终保持最小数量可用以使内核正常工作。即使开始内存回收也可能需要更多的RAM来完成工作:如果为了获取一些内存,您只需要一点内存但没有它,那将是灾难性的!:-)

  4. vfs_cache_pressure再次是一个百分比。它表示内核尝试摆脱用于文件系统(vfs =虚拟文件系统)的(内存)缓存的程度。文件系统的缓存是一个很好的丢弃候选者,因为它保持易于从磁盘读取的信息。不幸的是,如果计算机需要频繁使用文件系统,则必须反复读取相同的数据。缓存是巨大的性能提升。当然,如果系统进行的磁盘I / O很少,则在内存饥饿时,此缓存是最佳丢弃候选者。

所有这些都在此处简要说明:https://www.kernel.org/doc/Documentation/sysctl/vm.txt


非常感谢您的回答,只有一个问题需要澄清。如果没有交换分区,min_free_kbytes = 2G并且系统的可用内存降到了2GB,那么数据(Cache、缓冲区等)会被删除还是系统会进入OOM状态? - Mohamed Ashraf
@MohamedAshraf,我链接的文档非常简洁,它说:“将此设置得太高会立即使您的机器OOM。”我认为只要内核可以清除数据(实际上只有缓存),它就会继续工作,然后将进入一个无限循环,尝试达到指定的min_free_kbytes,但不会成功。但我并不确定。 - linuxfan says Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接