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