在有关交换文件的讨论中(“我应该创建一个吗?”),我经常看到一个晦涩的提及“在某些情况下交换文件弊大于利”。这通常与“如果你有 X GB 或更多 RAM,则不需要交换”一起出现,通常有可靠的论据支持。然后显然存在诸如此处表达的反驳论点。
我可以想象一个后台运行的应用程序或服务foo
,其正确功能取决于即时内存访问。删除用于交换的内存空间foo
会减慢对其的访问速度,从而foo
导致警告、错误甚至完全失败。
然而这就是我所得到的,实际的事实仍然难以捉摸。例如,我的 Linux 机器有 64GB RAM,允许我同时运行多个虚拟机。此时,许多 Linux 用户决定根本不进行交换,但我保留了 16GB 以防万一 - 驱动器空间很便宜,但经典swap = 2x RAM
似乎有点夸张。
澄清一下:RAM/交换区比率或是否应该首先分配交换区超出了问题的范围。
ilk*_*chu 34
交换可能很糟糕,因为它可能会使某些失败案例持续更长时间。考虑这样一种情况:由于错误、配置错误或其他此类原因,某些进程开始使用过多的内存。如果没有交换,它最终会导致系统内存不足,导致操作系统通过最终终止进程来解决问题。(但无论如何可能会造成其他麻烦。)
但是,如果存在大量交换空间,则进程将开始消耗交换空间,可能会在主内存和交换空间之间颠簸页面,从而减慢一切速度。系统最终会耗尽内存,但在此之前您会遭受更长时间的痛苦。
我主要考虑的是慢速交换设备,即旋转生锈的磁盘,因为这就是我遇到的情况......对于现代高速SSD来说,这可能不是一个问题。
(当然,一个正确的解决方案是对每个进程的内存使用进行限制,但如果缺乏这些限制,就像您通常的随机桌面系统可能所做的那样,交换空间是否存在的事实可能会产生影响。)
我并不是在评论交换一般来说是好是坏,只是评论一种可能的情况。我也不评论比率之类的;它们通常是概括性的,并且可能基于不再有效的要求。
use*_*489 18
从技术上讲,交换分区比交换文件更有效。实际上,如果交换文件是连续的,应该不会有太大的差异,并且和当前版本的linux相比,根本没有性能差异。交换文件存在一些错误,但它们仅在某些奇怪的情况下才会触发。
交换何时弊大于利完全取决于系统的工作负载。如果您的系统工作负载永远不会导致使用交换,那么就没有问题。如果您的程序分配了大量内存(最终在交换中)并且不再使用它,那么交换会有很大帮助(内存泄漏?)。
但是,如果正在运行的所有内容的总工作集大小(程序在物理内存中所需的大小)大于物理内存,并且一些溢出最终出现在交换中,那么您的系统将崩溃,不断尝试将内容推送到交换和加载其他东西回来。这可能会导致你的系统性能是正常的 1/10,并且可能感觉系统已经锁定,如果没有交换,某些东西就会被 OOM 杀死。
系统变得缓慢和混乱是否更好,或者某些东西被杀死并且系统性能恢复到更正常的状态是否更好,这是有争议的和具体情况。
除此之外的任何分析或尝试分配内存/掉期比率都将是针对具体情况或意见。
交换还用于其他目的,例如休眠,这要求您至少拥有与内存一样多的交换,并且可能还需要崩溃转储。
我想补充一点,以上所有内容都专门适用于 Linux。某些版本的 unix 特别需要足够的交换空间来隐藏所有 ram,如果您想要在此基础上添加虚拟内存,则需要比 ram 更多的交换空间。当前的 linux 在没有交换的情况下运行良好——一些 unix 不需要,并且极早期版本的 linux 也需要交换。
请记住,管理交换空间会消耗 RAM 和 CPU 周期 - 即使您没有真正开始使用交换空间。当然,并不多,但需要考虑 RAM 使用量(例如交换空间的 1/20)。内存压力会增加。CPU 周期可能要少得多。
交换隐藏了内存泄漏——这可能是好事(当你运行一个你需要忍受的坏软件时),也可能是坏事(这就是坏软件最初被允许存在的方式)。
在某些情况下,由于内存不足而短暂重新启动比长时间出现性能不佳更好。在其他情况下,则不然。
交换可能会在磁盘上写入敏感信息。包括但不限于加密密钥、密码、个人数据等……并无限期地保留它们,即使软件打算仅将它们短暂保留在内存中。有些软件明确锁定内存中已知敏感信息的页面,但此功能无法扩展到所有可能的敏感信息。这是对这些数据的日益增长的风险阐述。
我还没有看到一家 IT 企业拥有关于清除从运行系统中删除的磁盘的良好(有效且始终适用)策略。
加密交换区域(文件/分区)确实存在,但它们的代价是复杂性和性能的额外成本。至少有一段时间,在 Linux 中,加密交换文件以及分区上的一些加密方法曾经存在已知的稳定性问题。加密的 dm-crypt/luks 交换分区没问题。
性能 - 您达到了内存限制,您的用户发誓。SSD 在这方面更好,但请参见下文。
在某些操作系统中(例如Windows,我还没有看到Linux做同样的事情,但是坏习惯会传染),在物理内存耗尽之前,内存就会被“卸载”以进行交换——以防万一。是的,这(在某种程度上)提高了响应能力,但代价是总体性能较差,并且磁盘流量增加。
SSD 上的写入负载 - SSD 写入时会磨损。现代 SSD 相当耐用,但人们永远无法确定耐用程度 - 而且它们的故障模式相当令人不快。
它们相当快,人们可能直到很晚才知道交换的使用情况。