当 Linux 有交换分区时,Linux 能做什么,而没有交换分区则无法做到这一点?
对于这个问题,我想重点讨论具有 32 GB RAM 且无交换区的 Linux PC 与具有 16 GB RAM 且具有 16 GB 交换区的几乎相同的 Linux PC 之间的差异。注意我对此不感兴趣“是的,但是如果您将交换添加到 32 GB PC,您可能会看到 X 的改进”。这是这个问题的题外话。
我第一次遇到这样的观点:添加交换区比添加 RAM 更好在对早期问题的评论中。
我当然已经读过这个:如果我有足够的 RAM,我是否需要交换空间?和...
- 答案主要集中在添加交换,例如讨论磁盘缓存,其中添加 RAM 当然也会扩展磁盘缓存。
- 有人提到碎片整理只能通过交换来实现,但我找不到证据来支持这一点。
- 我看到一些对 MAP_NORESERVE 的引用
mmap
,但这似乎是一个非常具体且模糊的风险,仅与OOM情况并且可能仅私人的映射。
交换通常被视为扩展内存或提高性能的廉价方法。但当大规模生产嵌入式 Linux 设备时,情况就发生了逆转……
...在这种情况下,交换会磨损闪存,导致其在保修期结束前几年出现故障。将 RAM 加倍意味着设备需要额外花费几美元。
请注意,这是 eMMC 闪存不是SSD!。通常,eMMC 闪存不具备磨损均衡技术,这意味着它的磨损速度比 SSD 快得多
关于这个问题似乎确实有很多激烈争论的观点。我真的在寻找有关能力的干巴巴的事实,而不是“你应该/不应该”的意见。
哪些事情可以通过交换来完成,而通过添加 RAM 却无法完成?
答案1
休眠(或挂起到磁盘)。真正的休眠会完全关闭系统电源,因此 RAM 的内容会丢失,您必须将状态保存到某个持久存储中。又称交换。与使用 和hiberfil.sys
的Windows 不同pagefile.sys
,Linux 使用交换空间来实现过度使用的内存和休眠。
另一方面,休眠对于在 Linux 上正常工作似乎有点挑剔。你是否“能够”真正冬眠是另一回事。
答案2
哪些事情可以通过交换来完成,而通过添加 RAM 却无法完成?
这个问题实际上可以改写为使用非易失性 RAM 可以做什么,而通过添加更多易失性 RAM 却无法完成?。仅仅因为您碰巧将一个分区专用于分页(一种与易失性 RAM 交互的专用方式),它并不能改变它仍然是持久性辅助存储介质的一部分的事实。交换分区也不是使系统进入休眠状态所必需的,也可以使用在预先存在的分区上创建的“交换文件”。
最后,无论您使用的是交换分区还是交换文件,您将存储的都是要写入 RAM 或从 RAM 中写入的内容。如果您要从启用了交换分区的系统上拔下电源线,则该交换分区不会被神奇地删除。
虽然此交换数据不会在下次启动时读入(因为分页文件将具有与不再运行的进程相对应的条目),并且某些发行版可能会在正确关闭或正确重新启动期间采取故意步骤来销毁它,如果有人从系统中拔出一根线,他们就能够以取证方式检查该交换分区。
就您提到的嵌入式设备而言,闪存作为一种非易失性 RAM(NVRAM 或 EEPROM)存储,会因为其承受 I/O 命中的能力而磨损(闪存单元耐用性以程序数量表示) /擦除周期)与易失性 RAM 相比相形见绌。每次对该位置执行写入操作时,实际上都会削去一层氧化物,最终根本没有氧化物留下来允许持久存储电荷,并且在后续读取之前它实际上会泄漏出去。
另一方面,与闪存相比,如果切断电源,易失性 RAM 的生存能力几乎不存在(在理想实验条件下大约为几分钟)。在易失性 RAM 的情况下,没有什么可以阻止电荷泄漏和触发器的相应状态(输入,确定输出,然后重新确定输入),也称为反馈控制锁存器。
答案3
32GB RAM(无交换)与 16GB RAM(有 16GB 交换)。
这样问来,交换主要确实省钱,提高了性价比,也许还提高了每瓦的性能。
但交换仍然不仅仅是“内存像磁盘一样慢”。它是内存页面的临时存储,可以在需要时直接(尽管它们很脏,没有文件系统开销)加载到 RAM 中。
当然很大程度上取决于负载(种类负载),交换的想法甚至可能适得其反。这就是为什么除了swapon
/本身之外还有“swappiness”参数swapoff
,以及关于正确大小的讨论。
从维基百科我得到了关于Linux中“交换”的声明(在“分页”文章中)
Linux 内核支持几乎无限数量的交换后端(设备或文件......
如果多个交换后端被分配相同的优先级,它们将以循环方式使用(这有点类似于 RAID 0 存储布局),...
这表明您可以将交换变成在硬件级别上更有意义的东西:专用的“临时驱动器”将为这些交换出的页面提供更好的家。理想情况下,暂存驱动器应该(非常)小,但速度快且坚固。
根据“新”尺寸规则(正方形根Giga),您的示例应该比较:
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 或激活一个分区进行交换(我为此准备了一两个小分区)。
我查了一下这个兹拉姆, 进而交换事情: 非常有趣...:
相比之下,zswap 充当交换设备的基于 RAM 的缓存。这为 zswap 提供了针对较少使用的交换页面的逐出机制,这是 zram 所缺乏的。
另一方面,zram
无需任何交换设备即可工作。这使得我说的可能没有意义,但我没有考虑压缩。
我的观点是这样的驱逐“交换”固有的机制。这能在高负载下非常有用,无论是通过换出还是通过压缩进行交换。
答案4
与 RAM 不同,交换区可以容易地禁用、受限、减慢或扩展——在开发应用程序的内存分配策略时,这是一个有用的功能。
假设您的内核有 4G RAM 和 4G 交换空间,操作系统和开发应用程序(浏览器、IDE 等)消耗 3G。这就是 5G 免费虚拟:1G 真实网络和 4G 交换网络。
您正在开发新的数据库或游戏,需要 2G 来加载其热资源。就这样一路走来,sbrk
和 mmap
反复进行,并打开交换,通过内核 VM 层的奇迹获得真正的 2G。万岁,你的代码运行良好。 (你的浏览器或其他任何已经被页面降级到交换地狱的东西。)
现在,停止你的程序。swapoff
并重新运行您的程序。这一次,当它继续sbrk
咆哮时,它得到了一个ENOMEM
,你的代码必须处理一个不愉快的路径。它有何反应?在这个场景中它是如何跳舞的?
或者安装一个 USB 记忆棒,mkswap
然后swapon
在 USB 支架上增加vm.min_free_kbytes
强制内核更多地访问该 USB 记忆棒。重新运行您的程序。您的应用程序现在在缓慢的内存分配虚拟机上表现如何?
在您的应用程序运行时执行上述所有操作怎么样?一旦运行并开始遇到 OOM 情况,它会如何表现?
通过实时调整交换子系统,您可以通过无数种方法来折磨空闲真实 RAM 不足的系统。与 cgroups 或 rusage 不同,您不必关闭进程即可更改可用的虚拟 RAM。
您可以测试这些类型的内存滥用,使用模拟来模拟ENOMEM
或放慢速度brk
,这是一个合适的做法,因为它是稳定的。但是,没有什么比在低内存环境中进行实弹练习更能挖掘随机过程的黄金了。交换让测试人员可以轻松地动态调整内核的内存资源和特性,其方式与现实的低内存世界非常相似。添加或删除 RAM 棒不提供此值。