有什么方法可以限制 tmpfs 使用的 RAM 数量,而不限制交换数量?
大多数文档都说 tmpfs 的size
选项会限制 tmpfs 的总大小分割稍后会说这个空间由 RAM 和 SWAP 使用。然后说默认值是 RAM 的一半,因为如果它用完了所有 RAM,就会出现 OOM 致命错误。这很令人困惑。
例如,我希望它使用 1/4 的 RAM 但最多使用 3/4 的交换空间。
答案1
据我所知,您无法控制虚拟内存系统的哪些部分(即 RAM 或交换)用于 tmpfs。
但是,创建较大的 tmpfs 不会导致 OOM 致命错误。您可以创建大于总 RAM+SWAP 的 tmpfs,因为在将文件放入 tmpfs 之前,这些文件实际上都不会被使用。
当你做将文件放入 tmpfs 中,这将占用内存,但只占用放入 tmpfs 的文件的内存。如果您长时间不接触这些文件,并且系统需要使用比将它们保存在缓冲区缓存中更多的 RAM,那么这些文件实际上将从交换而不是 RAM 中备份。
当您对 tmpfs 的需求占到 RAM 的很大一部分时,它将影响您的缓冲区缓存(内容将不再缓存在 RAM 中,因为 tmpfs 文件需要它)。随着需求的增长,它将开始进入交换。最终,当您没有缓冲区缓存时,所有交换都已使用,并且仍会发出更多内存请求,那时您才会开始收到 OOM 错误。
因此,只要您有足够的交换空间,指定较大的 tmpfs 实际上是安全的/tmp
。您说使用 25% 的 RAM 和 75% 的交换空间是没问题的。在这种情况下,假设您通常有 1G 的 RAM 和 2G 的交换空间。我会将 tmpfs 设置为 1G,并将交换空间增加一点,比如说 3G。
如果您的系统面临内存压力,首先会发生的情况是,不常使用的文件/tmp
最终将由交换空间而不是 RAM 备份。通过使 tmpfs 的大小与 RAM 相同,您不会失去所有 RAM。