除非你的内存非常低,否则交换根本没有意义。
- 光盘比 RAM 慢 1000000 倍
- 交换使一切变得慢得多
除非在没有 RAM 的最后一刻,否则根本不应该激活它。为什么?因为 RAM 快了一百万倍。
答案1
交换不会让一切变得更慢;事实上它可以让事情变得更快。
看,有些应用程序将页面加载到内存中但从未使用过;它们存在于应用程序的构建方式中,包括库和各种复杂性、内存分配等,但可执行路径从不使用它。
那么为什么不扔掉这些内存页进行交换并释放它们以供其他用途呢?现在我们有更多的 RAM 可用于需要它的东西了吗?即使使用的是磁盘 I/O 缓存,通过将未使用的内容推送到交换区,我们可以更好地利用 RAM。
现在我们知道没有“一刀切”的解决方案,这就是为什么现代系统允许调音;我们可以从“仅在 RAM 不足时使用交换”转变为“机会主义地将东西放入交换”。不同的用例可能受益于不同的调整参数。甚至在某些用例中,零交换是最佳解决方案。
如果您希望仅在 RAM 用完时才使用交换区,那么 Linux 的“swappiness”设置可以帮助您。
答案2
除非你的内存非常低,否则交换根本没有意义。
仅当系统运行 100% 可预测的工作负载时,这才是正确的 - 例如,服务器/虚拟机仅运行一个特定的应用程序,其中它所处理的内容是完全已知和计划的。
然而,假设您正在运行 Linux 台式计算机 - 您正在处理一个大型视频文件,决定休息一下,并在浏览器中观看一些 Netflix 节目。但后来你厌倦了 Netflix 并决定玩游戏。
如果视频编辑器被调出页面进行交换,您的游戏性能将会更好。
因为RAM 速度很快,最好将其用于实际上正在做面向用户的事情- 当真正的人类用户实际驾驶时,这将有些不可预测。计算机无法读取用户的想法,但它可以做出一些有根据的猜测 - 如果应用程序 X 没有执行任何操作并且在 Y 分钟内没有收到用户输入或焦点,请将其放入交换中,以便正在接收用户输入或执行的操作工作时可以有RAM。
答案3
交换不会使系统变慢。运行尝试使用比 RAM 更多内存的程序会使系统变慢。如果这些程序不尝试使用这么多内存,则不会使用交换并且不会变慢。
或者更糟糕的是,尝试在没有交换的情况下运行相同的程序。现在,当内存不足时,系统就会停止运行。或者有什么东西被 OOM 收割者杀死了。现在不用swap是不是更快了?
现在,如果你得到一个行为不良的程序,它看到“哦,看看 100G 的交换空间和 20G 的内存,让我们使用 90G 的内存,因为它就在那里”,如果它受到更多限制,它就不会这样做,那么系统将交换越多,速度就越慢。解决方案不是减少交换。解决方案是通过调整参数来限制该程序,或者将其放入内存受限容器中,该容器允许您专门限制程序的交换使用或总体内存使用。
交换背后的原始理论是,(例如)交换设备可能比内存慢 10 倍,因此您希望大约十分之九的页面来自 RAM,十分之一来自交换,然后它关于收支平衡。在某些情况下,系统甚至可能能够预测它将需要交换的页面,并且可能会提前开始读取它,以便在需要时它已经在内存中,然后只要您的比率为好的。或者,如果您的应用程序存在内存泄漏,并且不再使用这些页面,则交换会免费为您提供更多内存。
交换的要点是,你的交换设备可能比 ram 慢 10 倍或 100 倍,但它也比 ram 便宜 10 倍或 100 倍……所以你可以假装你有更多的 ram,并以成本换取时间。如果您有钱和内存插槽,请务必购买更多内存并停止使用交换!
今天我们的计算机基于图灵机模型。但是理想的图灵机具有无限长的磁带(内存),而我们的计算机具有有限的内存。交换只是让我们更接近理想模型的一种方法。