在有关交换文件的讨论中(“我应该创建一个吗?”),我经常看到一个晦涩的提及“在某些情况下交换文件弊大于利”。这通常与“如果你有 X GB 或更多 RAM,则不需要交换”一起出现,通常有可靠的论据支持。然后就有明显的反驳论据,例如表达的这里。
我可以想象一个后台运行的应用程序或服务foo
,其正确功能取决于即时内存访问。删除foo
用于交换的内存空间会减慢对其的访问速度foo
,从而导致警告、错误甚至完全失败。
然而这就是我所得到的,实际的事实仍然难以捉摸。例如,我的 Linux 机器有 64GB RAM,允许我同时运行多个虚拟机。此时,许多 Linux 用户决定根本不进行交换,但我保留了 16GB 以防万一 - 驱动器空间很便宜,但经典swap = 2x RAM
似乎有点夸张。
- 有人可以举一些来自 UNIX/Linux 世界的现实生活中的例子吗?在具有大量 RAM 的系统中使用交换文件实际上可能会/确实会导致不必要的后果,以及这些后果可能/将会是什么?
- 使用单独的交换分区而不是交换文件会改变这种情况吗?
- 根据 user10489 的回答提示: *NIX-like OS:s 没有类似于 Windows 使用的单独的 hiberfile?
澄清一下:RAM/交换区比率或是否应该首先分配交换区超出了问题的范围。
答案1
交换可能很糟糕,因为它可能会使某些失败案例持续下去更长。考虑这样一种情况:由于错误、配置错误或其他此类原因,某些进程开始使用过多的内存。如果没有交换,它最终会导致系统内存不足,导致操作系统通过最终终止进程来解决问题。 (但无论如何可能会造成其他麻烦。)
但是,如果存在大量交换空间,则进程将开始消耗交换空间,可能会在主内存和交换空间之间颠簸页面,从而减慢一切速度。系统最终会耗尽内存,但在此之前您会遭受更长时间的痛苦。
我主要考虑的是慢速交换设备,即旋转生锈的磁盘,因为这就是我遇到的情况......对于现代高速SSD来说,这可能不是一个问题。
(当然,一个正确的解决方案是对每个进程的内存使用进行限制,但如果缺乏这些限制,就像您通常的随机桌面系统可能所做的那样,交换空间是否存在的事实可能会产生影响。)
我不会评论交换是好是坏一般来说,只是一种可能的情况。我也不评论比率之类的;它们通常是概括性的,并且可能基于不再有效的要求。
答案2
从技术上讲,交换分区比交换文件更有效。实际上,如果交换文件是连续的,应该不会有太大的差异,并且和当前版本的linux相比,根本没有性能差异。交换文件存在一些错误,但它们仅在某些奇怪的情况下才会触发。
交换何时弊大于利完全取决于系统的工作负载。如果您的系统工作负载永远不会导致使用交换,那么就没有问题。如果您的程序分配了大量内存(最终在交换中)并且不再使用它,那么交换会有很大帮助(内存泄漏?)。
但是,如果正在运行的所有内容的总工作集大小(程序在物理内存中所需的大小)大于物理内存,并且一些溢出最终出现在交换中,那么您的系统将崩溃,不断尝试将内容推送到交换和加载其他东西回来。这可能会导致你的系统性能是正常的 1/10,并且可能感觉系统已经锁定,如果没有交换,某些东西就会被 OOM 杀死。
系统变得缓慢和混乱是否更好,或者某些东西被杀死并且系统性能恢复到更正常的状态是否更好,这是有争议的和具体情况。
除此之外的任何分析或尝试分配内存/掉期比率都将是针对具体情况或意见。
交换还用于其他目的,例如休眠,这要求您至少拥有与内存一样多的交换,并且可能还需要崩溃转储。
我想补充一点,以上所有内容都专门适用于 Linux。某些版本的 unix 特别需要足够的交换空间来隐藏所有 ram,如果您想要在此基础上添加虚拟内存,则需要比 ram 更多的交换空间。当前的 linux 在没有交换的情况下运行良好——一些 unix 不需要,并且极早期版本的 linux 也需要交换。
答案3
更换不适当的媒体
由于写入周期数量有限,用作交换的 SD 卡往往会过早发生严重故障。由于 USB 带宽有限、廉价 SD 卡和内存有限,这在早期的树莓派设置中尤其是一个问题。
答案4
我可以想象一个后台运行的应用程序或服务 foo ,其正确功能取决于即时内存访问。删除 foo 用于交换的内存空间会减慢对其的访问速度,从而减慢 foo 本身的速度,从而导致警告、错误甚至完全失败。
这种推理是错误的。这个推理包含一个隐含的假设:将某些东西放入交换区和从物理 RAM 中丢弃它是同一件事。任何一个都可以在没有另一个的情况下发生。
干净的页面可以从 RAM 中丢弃,而不写入交换区。即使您没有交换文件,也可能会发生这种情况。因此,功能依赖于即时内存访问的程序可能会被搞砸,因为即使没有交换文件,其代码页也会从 RAM 中丢弃。事实上,如果没有交换文件,这种情况更有可能发生,因为如果没有交换文件,脏页就无法被丢弃,这意味着物理 RAM 中更有可能不存在干净页(例如代码)。
写入交换的页面不一定会从物理 RAM 中丢弃。页可以存在于交换 RAM 和物理 RAM 中。页面可以位于物理 RAM 中,也可以位于交换区中。
由于这两件事,上述论点就没有意义了。交换允许将长时间未访问的脏页从物理 RAM 中弹出。如果没有交换,则只能弹出干净页面,即使不存在长时间未访问过的干净页面。
无论有没有交换,您的关键进程都不能保证在 RAM 中找到数据。然而,如果有交换,则更有可能在 RAM 中找到数据。为什么?因为你能否在 RAM 中找到东西取决于系统的工作集是否适合 RAM。进行交换会删除工作集中从未访问过的脏页,从而减小其大小并增加其适合 RAM 的机会。