RAM 不能交换的具体功能是什么?

Phi*_*ing 44 linux swap

当 Linux 有交换而没有交换时,它可以做什么?

对于这个问题,我想关注例如具有 32 GB RAM 且无交换的 Linux PC 与具有 16 GB RAM 且具有 16 GB 交换的几乎相同的 Linux PC 之间的区别。请注意,我对“是的,但是如果您将交换添加到 32 GB 的 PC,您可以看到 X 改进”不感兴趣。这是这个问题的题外话。


我第一次遇到这样的观点,即添加交换比在早期问题的注释中添加 RAM 更好。

我当然已经通读了这个:如果我有足够多的 RAM,我是否需要交换空间?和...

  • 答案主要集中在添加交换,例如讨论磁盘缓存,其中添加 RAM 当然也会扩展磁盘缓存。
  • 有人提到只能通过交换进行碎片整理,但我找不到证据来支持这一点。
  • 我看到一些对 MAP_NORESERVE 的引用mmap,但这似乎是一个非常具体和模糊的风险,仅与OOM情况相关,并且可能仅与私有mmap 相关。

交换通常被视为扩展内存或提高性能的一种廉价方式。但是,当大规模生产嵌入式 Linux 设备时,情况就完全相反了……

...在这种情况下,swap 会磨损闪存,导致它在保修期结束前数年发生故障。将 RAM 加倍是设备上的几美元。

请注意,这是 eMMC 闪存而不是 SSD!. 通常,eMMC 闪存没有磨损均衡技术,这意味着它的磨损速度比 SSD 快得多


关于这个问题,似乎确实有很多争论不休的意见。我真的在寻找关于能力的枯燥的事实,而不是“你应该/不应该”的意见。

交换可以做什么而添加 RAM 也不能完成?

mur*_*uru 62

休眠(或挂起到磁盘)。真正的休眠会完全关闭系统电源,因此 RAM 的内容会丢失,您必须将状态保存到某个持久存储中。又名交换。与带有hiberfil.sys和 的Windows 不同pagefile.sys,Linux 将交换空间用于过度使用的内存和休眠。

另一方面,要在 Linux 上正常工作,休眠似乎有点挑剔。你是否“可以”真正冬眠是另一回事。¯\_(?)_/¯

  • @CodeCaster 那是交换的主要功能,是的。但是,至少在 Linux 上,休眠通过将状态写入交换(文件或分区,可以配置)来工作。 (2认同)
  • 并且(如果我们不是特定于 Linux)转储。请参阅 http://jdebp.uk./FGA/dont-throw-those-paging-files-away.html 。 (2认同)
  • 该链接后面的页面是 2007 年的。 (2认同)
  • *Linux 对过度使用的内存使用交换空间* 迂腐地说,“过度使用的内存”意味着没有足够的交换空间用于所有这些。内存过量使用很可能是 Linux 上的休眠不可靠的原因之一,但我还没有真正研究过它。 (2认同)
  • @ user253751 作为一般规则,它不会。事实上,您需要比 Linux 上的总可用 RAM 多的可用交换空间才能使休眠可靠地工作(忽略它具有的所有硬件和固件相关问题)。但是,您只需要足够的空间来容纳 _virtual_ 内存中的所有内容,这意味着只要系统上的总内存使用量不超过总可用 RAM 加上休眠图像元数据的一些额外开销,您通常美好的。 (2认同)

Net*_*ear 16

交换可以做什么而添加 RAM 也不能完成?

这个问题实际上可以改写为非易失性 RAM 可以做什么,而添加更多的易失性 RAM 也不能完成?. 仅仅因为您碰巧将一个分区专用于分页(一种与易失性 RAM 交互的专用方式),它并没有改变它仍然是持久性二级存储介质的一部分的事实。交换分区对于将系统置于休眠状态也不是强制性的,也可以使用在预先存在的分区上创建的“交换文件”。

最后,无论您使用的是交换分区还是交换文件,您将存储的是要写入 RAM 或从 RAM 写入的内容。如果您从启用了交换分区的系统中拔出电源线,则该交换分区不会被神奇地擦除。

虽然在您下次启动时不会读入此交换数据(因为分页文件将包含与不再运行的进程相对应的条目),但某些发行版可能会在正确关闭或正确重新启动期间故意采取措施销毁它,如果有人要从系统中拔出电源线,他们将能够以取证方式检查该交换分区。


就您提到的嵌入式设备而言,闪存是一种非易失性 RAM(NVRAM 或 EEPROM)存储,因为其承受 I/O 命中的能力(以程序数量表示的闪存单元耐久性)而磨损/erase 循环)与易失性 RAM 相比显得苍白无力。每次对该位置执行写入操作时,您实际上都会刮掉一层氧化物,最终根本就没有留下氧化物来允许持续存储电荷,并且在随后的读取之前它确实会泄漏出去。

另一方面,与闪存相比,如果或当您切断电源时,volatile 的 RAM 的生存能力几乎不存在(在理想的实验条件下大约为几分钟)。在易失性 RAM 的情况下,没有什么可以阻止电荷泄漏和触发器的相应状态(输入,确定输出,然后重新确定输入),也就是反馈控制锁存器。


小智 16

32GB RAM 和无交换对比 16GB RAM 有 16GB 交换。

像这样问,交换主要是省钱,提高每美元的性能,也许也是每瓦。


但是交换仍然不仅仅是“内存和磁盘一样慢”。它是内存页面的临时存储,可以在需要时直接(尽管很脏,没有文件系统开销)加载到 RAM 中。

当然,很大程度上取决于负载(负载的类型),交换的想法甚至可能适得其反。这就是为什么除了swapon/swapoff本身之外还有“swappiness”参数,以及关于正确大小的讨论。

从维基百科我得到了关于 linux 中“交换”的声明(在“分页”文章中)

Linux 内核支持几乎无限数量的交换后端(设备或文件...

如果为多个交换后端分配了相同的优先级,则它们以循环方式使用(有点类似于 RAID 0 存储布局),...

这表明您可以将交换转换为在硬件级别上更有意义的东西:专用的“暂存驱动器”将使这些换出的页面有一个更好的家。理想情况下,暂存驱动器应该(非常)小但快速且坚固。


根据“新”大小规则(千兆的平方根),您的示例应该比较:

16 GB RAM + 0 GB Swap+1000 GB Disk

16 GB RAM + 4 GB Swap+ 996 GB Disk

因为真正没有意义的是:

16 GB RAM+0 GB Swap + 1000 GB Disk

12 GB RAM+4 GB Swap + 1000 GB Disk

那将是 tmpfs(“ramdisk”)上的交换分区 - 甚至可能不会太有害,但我在这里看不到任何好处。你甚至不能冬眠。

(不过,请参阅下面的 zram 和 zswap,当您向其添加压缩时)


了解交换 您必须考虑整个系统和平均负载。而且由于 vm/mm(虚拟内存管理)是一个复杂的系统,因此很难说出明显的优势。我喜欢“平稳”过渡到过载系统的想法。

我有 8 GB RAM,没有交换。但我仍然捍卫这个概念,我能理解 AFA :-)


我在其中一个 OP 链接中找到了这个 redhat 引用。如果我记得的话,场景是不断增加的内存需求,在 2 GB RAM + 2 GB Swap 上:

...在我们的例子中[只是说明],相当多的交换可用,所以性能不佳的时间很长。

但替代方案OOM甚至更早!

“性能不佳的时间”很长,是的,但性能只会与负载成比例地下降。我不知道上下文,也许他们只是想警告交换分区太大。这听起来是反交换的,但再看又不是。

再说一次,出于同样的原因,我没有交换。我想知道我和我的应用程序何时达到上限,然后我将决定是否必须减少负载、购买更多 RAM 或激活用于交换的分区(我已准备好一两个小分区)。


了一下这个zram,然后是zswap 的东西:非常有趣...:

相比之下,zswap 充当交换设备的基于 RAM 的缓存。这为 zswap 提供了一种用于较少使用的交换页面的驱逐机制,这是 zram 所缺乏的。

另一方面,zram无需任何交换设备即可工作。这使得我所说的毫无意义成为可能,但我没有考虑压缩。

我的观点是“交换”中​​固有的这种驱逐机制。这可以是高负载下非常有用,不管你通过交换或通过压缩掉。

  • +1“[...] 交换主要是省钱 [...]”。从历史上看,这就是原因。 (4认同)
  • @rexkogitans:或者从另一个 POV,在正常操作期间避免 OOM 情况,因为您可以在古代机器中放置多少 RAM 的硬限制。仅仅在早期硬件上运行多任务操作系统是一个很大的挑战。 (3认同)
  • 根本没有反对你的Q。我想指出在交换和 RAM 之间比较 1 对 1 或“同类”的困难。我的“应该”是一个答案,而不是更正。也许我应该写 20GB RAM 与 16GB RAM + 4 GB 交换。但后来我们又回到“交换除了省钱什么都不做”。(这与永远真实的“购买更多 RAM”相同。) (2认同)

pjc*_*c50 15

对于给定的总数,将其作为 RAM 总是比交换更好。

noswap 系统和交换系统之间的行为存在差异,这可能有用也可能没有用:颠簸。随着交换系统开始耗尽可用的虚拟内存总量,它在交换和 RAM 之间来回移动页面时变得越来越受阻。这会减慢系统速度。在某些情况下,这可以允许手动或自动干预以减少负载并恢复系统。

在 noswap 系统中,性能保持相对水平,直到内存使用率非常高,此时操作系统开始从内存映射的可执行文件中卸载只读页面,并且磁盘缓存的空间也很小。很有可能此时会触发OOM杀手。所以是突然失效而不是缓慢退化。

我同意交换对于嵌入式系统毫无意义,尤其是在小型嵌入式 Flash 设备中。世界上到处都是小型 Linux 消费路由器、灯泡等,它们的内存使用量相当固定且没有交换。

  • 赞成指出*当然*最好让所有虚拟内存都由 RAM 支持。 (2认同)

bis*_*hop 10

与 RAM 不同,交换可以很容易地禁用、约束、减慢或扩展——在开发应用程序的内存分配策略时,这是一个有用的功能。

假设您的内核看到 4G 的 RAM 和 4G 的交换,并且操作系统和开发应用程序(浏览器、IDE 等)消耗 3G。那是 5G 免费虚拟:1G 真实和 4G 交换。

你正在开发你的新数据库或游戏,它想要说 2G 来加载它的热资源。所以这将一起sbrkmmap反复,并与交换上,通过内核的虚拟机层的奇迹真正获得其2G。万岁,您的代码运行良好。(并且您的浏览器或任何已被降级为交换地狱的页面。)

现在,停止你的程序。swapoff并重新运行您的程序。这一次,当它开始sbrk咆哮时,它得到了一个ENOMEM并且你的代码必须处理一个不愉快的路径。它如何反应?在这种情况下它是如何跳舞的?

或者安装一个 USB 记忆棒,mkswapswapon在 USB 安装上,并增加vm.min_free_kbytes以强制内核更多地转到该 USB 记忆棒。重新运行你的程序。您的应用程序现在在缓慢分配 VM 的情况下表现如何?

在您的应用程序运行时执行上述所有操作如何?一旦它运行并开始遇到 OOM 情况,它的行为如何?

您可以通过实时调整交换子系统来折磨在可用真实 RAM 上运行不足的系统的方法是无穷无尽的。与 cgroups 或 rusage 不同的是,您不必关闭进程来更改可用的虚拟 RAM。

您可以测试这些类型的内存滥用,使用模拟来模拟ENOMEM或慢速brk,这是一个合适的做法,因为它是稳定的。但是,没有什么比在低内存环境中进行实弹演习更能挖掘随机过程的黄金了。Swap 让测试人员可以轻松地动态调整内核的内存资源和特性,其方式与现实世界中的低内存非常相似。添加或移除 RAM 棒不提供此值。

  • 您可以使用各种技术来限制一个进程或一组进程的可用 RAM,*例如* cgroups。 (2认同)
  • 这是关于自愿使用交换而不是 RAM 的*唯一*用例。并且任何体面的系统设计人员都会确保数据库盒具有尽可能多的 RAM——理想情况下,DB 触及的每个数据都将永远保留在 RAM 中(好吧,直到希望有序关闭和后台同步)。 (2认同)
  • 交换不会导致缓慢的`malloc`(但我明白你的意思,没有交换你不能获得缓慢的页面输入)。cgroups 就是一个例子,你可以在 BSD 上用 rlimits 来做一些这样的事情,还有其他方法可以限制一个进程可用的内存量。此外,cgroup 可以在不重新启动进程的情况下动态更改。 (2认同)

Ala*_*lan 6

这是一个小众案例,诚然你可以添加更多的内存,但是......

每个人似乎都认为交换意味着物理非易失性存储,如硬盘驱动器或闪存驱动器。交换更多的是一个过程,而不是一个物理位置。

考虑以下奇怪的恶作剧:

  1. 我有一台配备 32GB RAM 且没有其他存储空间的设备。
  2. 我需要处理 42GB 的数据。
  3. 幸运的是,所说的数据是在很好的独立块中并且高度可压缩(可能类似于大部分静态的时间序列),而且我不需要一次访问它,所以......
  4. 我使用zram设置一个压缩的内存交换分区,这让我在不使用它时可以将大部分内容分页。
  5. 从而让我在不修改程序代码的情况下将更多数据放入有限的内存中。

用于交换(恰好在 RAM 中),这不仅仅是您从普通 RAM(其中没有交换分区)获得的。

虽然,是的,从技术上讲,您可以添加更多内存;这种奇怪的情况意味着无论你添加多少内存,你总是可以争取更多的空间(只要你知道你的数据/任何合适的东西)。