Linux VM 运行 nginx(或任何其他具有稳定资源使用的轻量级守护程序)。虚拟机分配了 2GB 内存,其中 200-300MB 供操作系统和服务使用,其余用于文件缓存和缓冲区。在一个特定的用例中,我期望一个简单的 500MB 开销。
问:为什么这个设置需要交换空间?
“防止内存耗尽”的标准答案在这里对我来说没有意义,原因有两个:1:对内存的需求已经确立,不需要支持意外或突然的显着增加。2:无论如何,Swap只会延迟OOM情况。同样的事情可以通过首先为虚拟机分配更多的内存来完成,特别是因为它是精简配置的,只要它未被使用,任何人都不会错过它。
支持休眠的另一个常见答案不适用于 VM 中的服务器。
我认为没有理由在这样的服务器上进行交换;我错过了什么吗?
您不应该考虑“是否有交换”,您应该考虑您的整体内存分配策略并确定是否需要交换。这有两个主要方面。
如今交换的主要目的不是扩展物理内存,而是为其他不可回收的页面(例如内存分配和匿名
mmap
s)提供后备存储。如果在没有交换的情况下运行,则会强制内核将匿名内存保留在物理内存中,这会降低其应对不同内存需求的能力。显然,如果您知道您的工作负载始终适合可用的物理内存,那么这应该不是问题。要考虑的第二个方面是内核的过度使用策略。默认情况下,无论内存负载如何,内存分配大部分都会成功。如果你想控制你的工作量,在检查模式下运行通常会很有帮助(
/proc/sys/vm/overcommit_memory
设置为 2);然后提交被限制为交换的总和,并且未为大页面分配的物理内存由过度使用比率(默认为 50%)调整。如果您在没有交换的情况下运行,则默认情况下没有任何东西可以分配超过一半的物理内存;添加交换会线性增加限制,比增加过度使用率风险更小。(当试图在典型的服务器设置上运行大型 JVM 时,这经常会让人绊倒。)我提到了上面描述的两个主要方面,但在我看来,在某些情况下还需要考虑另一点(它实际上是第一点的变体):
tmpfs
文件系统很容易让您的系统陷入困境,如果没有交换...有关这一切的更多信息,我建议阅读
proc(5)
手册页中关于过度使用的部分,以及Chris Down 最近的博客文章为 swap 辩护。您不需要交换空间,但有几点您没有提到值得牢记。系统启动时加载的某些页面将永远不会再被触摸。可以说将它们留在磁盘上而不是在内存中更好,尽管任何性能提升都可能很小。
在相关的说明中,一些工作负载(例如 jvm)分配了相当多的内存,这些内存可能永远不会被使用。如果你的工作量习惯性地过度使用,你可能会把婴儿和洗澡水一起扔出去。将内核限制为物理内存可能意味着您要么 a) 分配比 VM 需要的更多 RAM,浪费可能用于其他 VM 的服务器资源,要么 b) 导致内核减少缓冲区数量以保留未使用的(或很少used) 分配的页面,从而导致磁盘活动增加,从而降低整体性能。
如果不启用交换,如果您需要登录系统进行调试,您可能会发现开销神秘地消失了。实际上只需要一次登录到一个结合了严格的启动内存限制和内存泄漏的系统,以鼓励更自由的交换空间策略。用一个小时在一个 thrashing 机器上做任何事情仍然比 OOM 杀手不断开火的改进。
最后,在 Unix 系统中将内核转储放置在交换中的情况并不少见。相当多的管理员仍会分配足够的交换空间以允许调试内核崩溃。(尽管显然 Linux 现在为此提供了解决方法。)