为什么 Linux 需要虚拟机中的交换空间?

为什么 Linux 需要虚拟机中的交换空间?

运行 nginx(或任何其他具有稳定资源使用的轻量级守护进程)的 Linux VM。 VM 分配了 2GB 内存,其中 200-300MB 用于操作系统和服务,其余用于文件缓存和缓冲区。在一个特定的用例中,我预计开销会轻松达到 500MB。

问:为什么此设置需要交换空间?

“防止内存耗尽”的标准答案对我来说没有意义,原因有两个:1:对内存的需求已经确定,不需要支持意外或突然的显着增加。2:无论如何,交换只会延迟 OOM 情况。同样的事情可以通过首先为虚拟机分配更多内存来完成,特别是因为它是精简配置的,只要它未被使用,任何人都不会错过它。

支持休眠的另一个常见答案不适用于虚拟机中的服务器。

我认为没有理由在这样的服务器上进行交换;我错过了什么吗?

答案1

你不应该考虑“是否有交换”,你应该考虑你的整体内存分配策略并确定是否需要交换。这有两个主要方面。

如今交换的主要目的不是扩展物理内存,而是为其他不可回收的页面提供后备存储(例如内存分配和匿名mmap)。如果在没有交换的情况下运行,则会强制内核将匿名内存保留在物理内存中,这会降低其应对变化的内存需求的能力。显然,如果您知道自己的工作量总是适合可用的物理内存,这不应该是问题。

要考虑的第二个方面是内核的过度使用策略。默认情况下,无论内存负载如何,内存分配大部分都会成功。如果您想控制工作负载,在检查模式下运行通常会很有帮助(/proc/sys/vm/overcommit_memory设置为 2);那么提交限制为交换空间和未分配给大页的物理内存的总和,并通过过度使用比率(默认为 50%)进行调整。如果您在没有交换的情况下运行,则默认情况下没有任何东西可以分配超过一半的物理内存;添加交换会线性增加该限制,并且比增加过度使用率的风险更小。 (当人们试图在典型的服务器设置上运行大型 JVM 时,这常常会让人们感到困惑。)

我提到有两个主要方面,如上所述,但我想到在某些情况下还可以考虑另一点(它实际上是第一点的变体):tmpfs如果文件系统很容易让您的系统陷入困境,没有交换...

有关这一切的更多信息,我建议阅读proc(5)联机帮助页关于过度使用的部分,以及Chris Down 最近发表的博客文章为交换辩护

答案2

你不需要交换空间,但有几点您没有提到但值得牢记。有些页面在系统启动时加载,将永远不会被再次触及。可以说,将它们留在磁盘上而不是内存中更好,尽管性能提升可能很小。

与此相关的是,某些工作负载(例如 jvm)会分配大量可能永远不会使用的内存。如果你的工作量习惯性超负荷,你可能会把孩子和洗澡水一起倒掉。将内核限制为物理内存可能意味着您要么 a) 分配比 VM 需要更多的 RAM,浪费可能会分配给其他 VM 的服务器资源,要么 b) 导致内核减少缓冲区数量,以便保留未使用的(或很少使用的)使用)分配的页面会导致磁盘活动增加,从而降低整体性能。

如果没有启用交换,如果您需要登录系统进行调试,您可能会发现您的开销神秘地消失了。实际上只需要登录一次系统,该系统就结合了严格的启动内存限制和内存泄漏,以鼓励更自由的交换空间策略。与不断发射的 OOM 杀手相比,在机器上花一个小时做任何事情仍然是一个进步。

最后,在 Unix 系统中将内核转储放置在交换区中并不罕见。相当多的管理员仍然会分配足够的交换空间来调试内核恐慌。 (尽管显然 Linux 现在提供了解决这个问题的方法。)

相关内容