我在几个网站上看到,建议将 swappiness 降低到 10-20 以获得更好的性能。
这是神话还是不是?这是一般规则吗?我有一台配备 4GB 内存和 128GB SSD 硬盘的笔记本电脑,您对我的交换能力有什么建议?
谢谢。
tho*_*ter 104
因为大多数人认为交换=坏,并且如果您不减少交换,系统将在真正不需要时进行交换。这两个都不是真的。人们将交换与系统陷入困境的时间联系起来 - 然而,交换主要是因为系统陷入困境,而不是相反。当系统交换时,它已经在决定交换时考虑了性能成本,并决定不这样做会对系统性能或稳定性造成更大的整体损失。
总体而言,默认设置可带来良好的整体性能和稳定性。我建议将其保留为默认值。Linux 有进一步的途径来改进其内存管理以解决一些边缘情况,但总的来说,swappiness 控制不是一个好的解决方法 - 朝一个方向调整它,你可能会修复一个问题并创建其他问题。如果可能的话,简单地安装更多的物理内存(并单独留下交换)会使所有其他补救措施黯然失色。
Linux 如何使用 RAM
任何未被应用程序使用的 RAM 都可以用作“缓存”。缓存对于快速、平稳运行的系统很重要,可以加快对磁盘的读取和写入速度。
如果您的应用程序将它们的内存使用量增加到几乎占用了您所有 RAM 的程度,您的缓存将缩小,结果磁盘操作平均会变慢。现在只有几十兆字节或更少的缓存是不够的。
如果应用程序进一步增加它们的内存使用量 - 假设您没有交换空间 - 您不仅将没有缓存空间,而且最终会耗尽内存,并且您的系统将不得不终止正在运行的进程。杀死进程比减速更糟糕,因为它会给你一个不稳定、不可预测的系统。
Linux 如何使用交换
为了解决这两个问题,您的系统可以将一些很少使用的应用程序内存重新分配到磁盘上的交换空间,从而释放 RAM。额外的 RAM 可以防止进程因内存不足而死亡,并且可以回收一点缓存,使磁盘操作可以更顺畅地运行。
但是,这种重新分配不是根据明确的截止时间完成的。在 Linux 开始交换之后,您没有达到一定的分配百分比。它有一个“模糊”算法。它考虑了很多事情,最好用“内存分配有多大压力”来描述。如果分配新内存有很大的“压力”,那么它会增加一些被交换以腾出更多空间的机会。如果“压力”较小,那么这些机会就会减少。
你的系统有一个“swappiness”设置,可以帮助你调整这个“压力”的计算方式。它通常被错误地表示为“RAM 的百分比”,但事实并非如此,它只是用作公式一部分的值。40 到 60 左右的值是推荐的合理值,现在 60 是默认值。
让您的系统在必要时进行交换总体上是一件非常好的事情,即使您有很多 RAM。如果需要让您的系统交换让您放心,如果您遇到内存不足的情况,即使是暂时的(在运行使用大量内存的短进程时),您的系统还有第二次机会保持一切运行。如果您完全禁用交换,那么您可能会因无法分配内存而导致进程被杀死。
当系统陷入困境并大量交换时会发生什么?
交换是一个缓慢且代价高昂的操作,因此系统会避免它,除非它计算出缓存性能的权衡将总体上弥补它,或者如果有必要避免杀死进程。
很多时候,人们会看到他们的系统正在严重打击磁盘并使用大量交换空间并指责交换。这是错误的做法。如果交换达到这种极端,则意味着交换是您的系统尝试处理低内存问题,而不是问题的原因,如果不交换,您的运行进程将随机死亡。
桌面系统呢?他们不需要不同的方法吗?
桌面系统的用户确实希望系统能够“感觉响应”以响应用户启动的操作,例如打开应用程序,这种操作有时会由于所需内存的增加而触发交换。
有些人试图调整这一点的一种方法是减少swappiness参数,这可以增加系统对使用内存和缓存空间不足的应用程序的容忍度。
然而,这只是转移球门柱。第一个应用程序现在可以在没有交换操作的情况下加载,但它会为下一个加载的应用程序留下更少的空闲时间。同样的交换可能会在稍后发生,当您下次打开应用程序时。同时,由于缓存大小减小,系统性能总体较低。因此,降低swappiness设置的任何好处可能难以衡量,有时会减少交换延迟,但有时会导致其他性能下降。如果您知道自己在做什么,稍微减少 swappiness 可能是合理的,但将其减少到 10 可以让系统容忍非常低的缓存大小,并使系统更容易不得不在短时间内进行交换。
应避免完全禁用交换,因为您会失去针对可能导致进程崩溃或被终止的内存不足情况的额外保护。
到目前为止,最有效的补救措施是在负担得起的情况下安装更多 RAM。
无论如何可以在具有大量 RAM 的系统上禁用交换吗?
如果您的 RAM 远远超过应用程序可能需要的 RAM,那么您将很少需要交换。因此,在所有通常情况下,禁用交换可能不会产生任何影响。但是如果你有足够的内存,启用交换也不会有任何损失,因为系统在不需要时不会交换。
它会产生影响的唯一情况是在不太可能的情况下,系统发现自己内存不足,因此缓存系统受到阻碍,并且在这种情况下,您最需要交换。因此,当您有足够的内存时,您可以安全地将交换保留在其正常设置中以增加安心,而不会产生负面影响。
但是交换如何加速我的系统?交换不会减慢速度吗?
将数据从 RAM 传输到交换的行为是一个缓慢的操作,但只有在内核非常确定保持合理的缓存大小所带来的整体收益将超过这一点时才会采取它。如果您的系统由于磁盘抖动而变得非常缓慢,交换不会导致它,而只是试图减轻它。
一旦数据在交换中,它什么时候再次出来?
任何给定的内存部分都会在使用后立即从交换中返回 - 读取或写入。然而,通常被交换的内存是很长时间没有被访问并且预计不会很快需要的内存。
从交换区传输数据与将数据放入交换区一样耗时。如果不需要,您的内核不会从中删除数据。虽然数据是在交换和不被使用,它留下的是其他的东西更多的内存的使用,更加系统缓存。
是否有任何情况下减少swappiness 是合适的?
是的。如果您运行的服务器专用于某个无法从系统缓存中受益的特定服务器应用程序。某些数据库服务器(例如 Oracle 服务器、MySQL/MariaDB)在某些情况下建议将交换率降低到 1 到 10,因为这些数据库引擎使用自己的缓存。
请注意,仅当您的系统专用于该任务时,这才是正确的,并且在 MySQL/MariaDB 的情况下,仅当您使用纯粹的 InnoDB 或 XtraDB 而不是 MyISAM 或 Aria 等时,如果您的系统的专用目的是以一个应用程序为中心进行自己的缓存并且不会从系统缓存中受益,降低swappiness可能是一个好主意。
小智 18
在普通桌面上,您有 4-5 个活动任务,它们占用 50-60% 的内存。如果您将 swappiness 设置为 60,那么大约 1/4-1/3 的 ACTIVE 任务页面将被换出。这意味着,对于每个任务更改,对于您打开的每个新选项卡,对于每个 JS 执行,都会有一个交换过程。
解决方案是将swappiness设置为10。根据实际观察,这会导致系统放弃磁盘io缓存(这在桌面上几乎没有作用,因为读/写缓存实际上根本没有使用。除非您不断复制LARGE文件)而不是将任何内容推送到交换中。在实践中,这意味着系统将拒绝交换页面,而是削减 io 缓存,除非它达到 90% 的已用内存。这反过来又意味着流畅、无需交换、快速的桌面体验。
然而,在文件服务器上,我会将 swappiness 设置为 60 甚至更多,因为服务器没有必须作为整体保存在内存中的大量活动前台任务,而是许多正在工作或正在休眠的较小进程,并没有真正立即改变他们的状态。相反,服务器通常向客户端提供(原谅)完全相同的数据,从而使磁盘 io 缓存更有价值。因此,在服务器上,最好换出休眠进程,为磁盘缓存请求释放内存空间。
但是,在台式机上,这种精确设置会导致换出 REAL 应用程序的内存块,这些内存块几乎不断修改或访问此数据。
奇怪的是,浏览器通常会保留大量内存,它们会不断修改。当这些块被换出时,如果它们被请求返回需要一段时间——同时,浏览器会继续更新它的缓存。这会导致巨大的延迟。实际上,您将等待 2 分钟等待新选项卡中的单个网页加载。
桌面并不真正关心磁盘 io,因为桌面很少读取和写入可缓存的重复大部分数据。减少磁盘 io 以尽可能多地防止交换对于桌面来说更有利,而不是将 30% 的内存保留给磁盘缓存,同时换出 30% 的 RAM(充满属于活跃使用的应用程序的块)。
只需启动 htop,打开浏览器、GIMP、LibreOffice - 在那里加载一些文档,然后浏览几个小时。它真的那么容易。
小智 10
如果您在 Linux 系统上运行 Java 服务器,您真的应该考虑将 swappiness 从默认值 60 减少很多。所以 20 确实是一个好的开始。交换是垃圾收集过程的杀手,因为每次收集都需要触及进程内存的大部分。操作系统没有办法检测这些进程并为它们做正确的事情。最好的做法是尽可能避免为生产应用程序服务器进行交换。
小智 5
我建议在打开系统监视器的同时进行一些实验,以查看您的机器到底有多少负载,我还使用 4GB 内存和 128GB SSD 运行,因此将 swappiness 值更改为 10,这不仅提高了负载下的性能,而且作为奖励也将增加 SSD 驱动器的寿命,因为它会受到更少的写入。
有关如何使用完整说明进行操作的简单视频教程,请参阅下面的 YouTube 视频
我想补充一些大数据性能工程师的观点,让其他人了解 2017 年技术的更多背景。
我的个人经验是,虽然我通常禁用交换以保证我的系统以最大速度运行,但在我的工作站上针对特定问题,我发现 1 和 10 的交换会导致冻结(永远)和长时间的停顿。与默认值 (60) 相比,此特定应用程序的 Swappiness 80 可带来更好的性能和更短的暂停。请注意,我有 8GB RAM 和 4x 256GB 交换,由 1 个 HDD 支持。我通常会说明在我的基准测试和完整硬件规格中看到的精确统计数据,但我还没有做任何事情,而且这是最近的低端台式机,在这里并不重要。
回到我以前的公司,我们没有在具有 [500GB 到 4TB] x [10-100] 个节点的 Spark 服务器上启用 swappiness 的原因是我们认为性能不佳是重新设计数据管道和数据结构的标志,以更高效方式。我们也不想对 HDD/SSD 进行基准测试。此外,交换这么多 RAM 将需要每个节点 10-30 个磁盘进行并行写入,以最大限度地减少磁盘访问时间。
20年前的今天,20年后的今天,内存过大的问题依然存在。有了无限的时间和金钱,我们可以购买/租赁更多的硬件或重新设计任何流程,以使性能达到理想的水平。交换只是一个让我们忽略真正问题的黑客(我们没有足够的内存,我们不想花更多的钱)。
对于那些认为更高的swappiness是一个坏建议的人,这里有一个小观点。过去,硬盘只有几 kb 的缓存(如果有的话)。接口是IDE/并行ATA。CPU 总线以及 RAM 和许多其他东西也慢得多。简而言之,系统在各个方面都非常缓慢(相对于今天)。几年前,硬盘驱动器使用 SATA3。今天,他们使用 NVMe 协议,该协议具有显着的延迟改进。HD 有很多 MB 的缓存。最有趣的部分是当您使用带有 NVMe 或 PCIe 的现代 SSD(更稳定的读/写耐久性和性能)作为交换存储时。这是成本和性能之间的最佳折衷。请不要尝试使用廉价或旧的 SSD。
交换+SSD!对于高性能易失性存储,我强烈建议尝试使用高交换值。它主要取决于内存访问模式(随机访问所有内存 vs 很少访问大部分内存)、内存使用情况、磁盘带宽是否已经饱和以及抖动的实际成本。