为什么大多数人建议将互换性降低到10-20?


65

我在几个站点中都看到过,建议将swappiness降低到10-20,以获得更好的性能。

这是神话吗?这是一般规则吗?我有一台配备4GB Ram和128GB SSD的笔记本电脑,您对我的交换性有何建议?

谢谢。


5
您列出的那些网站没有说明为什么建议您更改默认值。对于棘手的复杂问题选择,此处的答案要好得多。
nealmcb 2013年

Answers:


88

因为大多数人认为交换=不好,并且如果您不减少交换问题,那么系统将在真正不需要时进行交换。这些都不是真的。人们将交换与他们的系统陷入困境的时间联系在一起-但是,这主要是因为系统在陷入困境,而不是相反。当系统进行交换时,它将在决定交换时已经考虑了性能成本,并决定不这样做将对系统性能或稳定性造成更大的总体损失。

总体而言,默认设置可提供良好的总体性能和稳定性。我建议将其保留为默认值。Linux还有进一步的途径来改善其内存管理以解决某些极端情况,但是总的来说,交换控制不是一个好的解决方法-朝一个方向调整它,您可能会解决一个问题并造成其他问题。如果可能的话,只需安装更多的物理RAM(并保持交换能力),就会使所有其他补救措施黯然失色。

Linux如何使用RAM

应用程序未使用的任何RAM都可以用作“缓存”。高速缓存对于快速,平稳运行的系统非常重要,它可以加快磁盘的读写速度。

如果您的应用程序将其内存使用量增加到几乎使用所有RAM的程度,则缓存将减少,平均而言,磁盘操作将因此而变慢。如今仅拥有几十兆字节或更少的缓存是不够的。

如果应用程序进一步增加内存使用量(假设您没有交换空间),则不仅将没有缓存空间,而且最终将耗尽内存,系统将不得不终止正在运行的进程。杀死进程比放慢速度要糟,因为它会给您带来不稳定,不可预测的系统。

Linux如何使用交换

为了解决这两个问题,您的系统可以将一些很少使用的应用程序内存重新分配给磁盘上的交换空间,从而释放RAM。额外的RAM可以防止由于内存不足而导致进程死机,并可以回收少量缓存,从而使磁盘操作可以更平稳地运行。

但是,此重新分配并未根据明确的截止时间进行。Linux开始交换之后,您没有达到一定的分配百分比。它具有“模糊”算法。它考虑了很多事情,最好用“内存分配有多少压力”来描述。如果分配新内存的压力很大,那么将增加交换某些内存以腾出更多空间的机会。如果“压力”较小,则将减少这些机会。

您的系统具有“ swappiness”设置,可帮助您调整“压力”的计算方式。它通常被错误地表示为“ RAM的百分比”,但事实并非如此,它只是用作公式一部分的值。建议的理智值在40到60之间,当今是默认值60。

即使您有很多RAM,让系统在必要时进行交换也是一件好事。如果需要交换系统,可以让您高枕无忧,即使您暂时遇到内存不足的情况(在运行使用大量内存的较短进程时),系统也有第二次机会使所有内容保持运行。如果您要完全禁用交换,则可能会由于无法分配内存而导致进程被杀死。

当系统陷入瘫痪并大量交换时,会发生什么情况?

交换是一项缓慢且昂贵的操作,因此,除非系统计算出高速缓存性能的权衡将整体上弥补它,或者有必要避免终止进程,否则系统将避免这种交换。

很多时候,人们会看到严重破坏磁盘的系统,并使用大量的交换空间并为此指责交换。那是错误的方法。如果交换达到了这种极限,则意味着交换是系统处理内存不足问题的尝试,而不是问题的原因,并且如果不进行交换,则正在运行的进程将随机地死掉。

桌面系统呢?他们不是需要其他方法吗?

桌面系统的用户确实确实希望系统响应用户启动的操作(例如打开应用程序)而“响应”,由于打开的内存需要,这种操作有时会触发交换操作。

有人尝试进行调整的一种方法是减少swappiness参数,该参数可以提高系统对应用程序使用内存和缓存空间不足的容忍度。

但是,这只是在改变球门柱。现在,第一个应用程序可能无需进行交换操作即可加载,但是它将为下一个加载的应用程序留出更少的空闲时间。当您下次打开应用程序时,稍后可能会发生相同的交换。同时,由于减小的缓存大小,系统性能总体较低。因此,从降低的可交换性设置中获得的任何好处可能难以衡量,有时会减少交换延迟,但有时会导致其他性能下降。如果您知道自己在做什么,则稍微降低交换性可能是合理的,但是将交换性降低到10%可能会使系统对非常小的缓存大小保持容忍,并使系统更容易在短时间内进行交换。

应避免完全禁用交换,因为您失去了针对内存不足状况的额外保护,内存不足状况可能导致进程崩溃或被终止。

到目前为止,最有效的解决方法是在负担得起的情况下安装更多RAM。

可以在具有大量RAM的系统上禁用交换功能吗?

如果您的RAM远远超过应用程序可能需要的RAM,则几乎不需要交换。在大多数情况下,禁用交换可能不会有所作为。但是,如果您有足够的RAM,那么启用交换功能也不会带来任何损失,因为系统不需要时不会交换数据。

唯一造成影响的情况是,在不太可能发生的情况下,系统发现自己的内存不足,因此缓存系统受到了阻碍,而在这种情况下,您最希望交换内存。因此,您可以安全地将swap保留在其常规设置上,以增加内心的平静,而不会在有大量内存时产生负面影响。

但是如何交换可以加快我的系统速度?难道不减慢速度吗?

将数据从RAM传输到交换的动作很慢,但是只有在内核完全确定由于保持合理的缓存大小而带来的总体收益将超过此收益时,才采取这种措施。

交换数据后,什么时候可以再次输出?

内存的任何给定部分将在使用后立即退出交换-读取或写入。但是,通常交换的内存是长时间未访问的内存,预计不会很快需要。

从交换中转移数据与将数据放入交换中一样耗时。如果不需要,您的内核不会从其中删除数据。虽然数据是在交换和不被使用,它留下的是其他的东西更多的内存使用,更加系统缓存。

在任何情况下都应该减少交换性?

是。如果您正在运行专用于一个特定服务器应用程序的服务器,而该服务器无法从系统缓存中受益。某些数据库服务器(例如Oracle服务器,MySQL / MariaDB)在某些情况下建议将可交换性降低到1到10,因为这些数据库引擎使用自己的缓存。

请注意,仅当您的系统专用于该任务时才适用,对于MySQL / MariaDB,仅当您仅使用InnoDB或XtraDB,而不是MyISAM或Aria等时,才适用。


感谢您的详尽描述。我认为在我的情况下(4GB Ram和128GB SSD硬)并且结合我的用法(Java EE开发和虚拟机中的多个操作系统),swappiness = 20是合适的。你怎么看?
赛义德Zarinfam 2012年

我认为默认值60最好。
thomasrutter 2012年

4
@BlancaHiggins您阅读了您发表评论的帖子吗?您的评论似乎并未描述交换实际上是做什么的。
thomasrutter 2014年

1
这是一个很好的答案。非常感谢您提供如此出色的解释。
丹·巴伦

2
我认为SwapFaq中的部分信息会引起误解:将其设置为100会“积极地”进行交换。我认为这是一个非常谨慎的主动设置,更准确地说,是在第一个迹象表明可用内存或高速缓存变得越来越低时才进行交换。而较低的设置(例如10)则更危险,更令人兴奋,请避免进行任何交换,直到可用内存非常低并且缓存几乎完全消失为止,从而使系统没有太多的摆动空间。
thomasrutter

14

在普通台式机上,您有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-在其中加载少量文档,然后浏览几个小时即可。真的很容易。


3
+1用于服务器与台式机的差异描述。服务器的磁盘缓存可以在磁盘字段上完成。

如果是这种情况,为什么Ubuntu的服务器版本和桌面版本都默认为60的交换率?如果您说的是正确的,那么为桌面版本提供默认值20甚至10更为合理,但事实并非如此。
JAB

1
关于交换性是被交换的ram的直接百分比的暗示的参考?我认为它不是那样的。
Xen2050

1
没有。Swappiness与RAM的百分比无关。它是一个旋钮,用于调整模糊算法,使其在给定的问题情况下或多或少地具有互换性。我还认为此答案中对服务器和台式机工作负载的描述做出了一堆并不总是成立的假设。
thomasrutter

9

如果在Linux系统上运行Java服务器,则应该真正考虑将交换性从默认值60降低很多。因此20确实是一个好的开始。交换是垃圾收集过程的杀手,因为每次收集都需要接触过程内存的大部分。操作系统无法检测此类进程并使它们正确无误。最佳实践是避免尽可能多地交换生产性应用服务器。


的确,如果您将服务器专用于专门的工作负载,而您却无法从系统缓存中受益(例如数据库服务器),那么减少交换可能是有意义的。我认为垃圾回收并不是专门的案例。如果经常触摸内存,它将不会被交换,它将被保存在物理RAM中。唯一的情况不是这样,如果您遇到严重的内存不足情况-交换不承担责任。
thomasrutter

4

我建议做一些实验,同时打开系统监视器,以查看您的计算机到底有多少负载,我还运行4GB内存和128GB SSD,因此将swappiness值更改为10,这不仅改善了负载下的性能,而且另外,由于减少了写入操作,因此额外增加了SSD驱动器的寿命。

有关如何进行完整说明的简单视频教程,请参见下面的YouTube视频

http://youtu.be/i6WihsFKJ7Q


1
您制作的精彩视频,但视频并不能真正直接回答问题,更多地是关于如何更改交换性的方法。
jmunsch 2014年

+1表示SSD的使用寿命,如果系统尽可能是只读的,则SSD最好,剩余的应该留在内存中。今天,内存在当前台式机上通常不是大问题。
Dee 2014年

3

我想补充一下大数据性能工程师的观点,以便为其他人提供有关2017年技术的更多背景知识。

我的个人经验是,虽然我通常禁用交换以确保我的系统以最大速度运行,但是在我的工作站上由于一个特定的问题,我发现交换率为1和10会导致冻结(永久)和长时间停顿。与默认值(60)相比,此特定应用程序的Swappiness为80可导致更好的性能和更短的暂停。请注意,我有8GB RAM和1个HDD支持的4x 256GB交换。我通常会说出在基准测试和完整的硬件规格中看到的精确统计信息,但是我还没有做任何事情,这是一个最近的低端台式机,在这里并不重要。

回到我以前的公司时,之所以没有在具有[500GB至4TB] x [10-100]节点的Spark服务器上启用交换能力,是因为我们认为性能不佳是重新设计数据管道和数据结构以提高效率的标志。方式。我们也不想对HDD / SSD进行基准测试。同样,交换这么多的RAM将需要每个节点10-30个磁盘并进行并行写入,以最大程度地减少磁盘访问时间。

今天,即20年前和将来的20年,仍然存在一些问题,那就是RAM太大了。凭借无穷的时间和金钱,我们可以购买/租赁更多的硬件或重新设计任何流程,以使性能达到理想的水平。交换只是一种让我们忽略实际问题的技巧(我们没有足够的内存,我们不想花更多的钱)。

对于那些认为提高交换性是个坏建议的人,这里有一个观点。过去,HD仅具有几kb的缓存(如果有)。接口为IDE / Parallel ATA。CPU总线以及RAM和许多其他东西也慢得多。简而言之,系统在各个方面都非常缓慢(相对于今天)。几年前,HDD使用SATA3。今天,他们使用NVMe协议,该协议显着改善了延迟。HD具有许多MB的缓存。最有趣的部分是当您使用具有NVMe或PCIe的现代SSD(具有更稳定的读/写耐久性和性能)作为交换存储时。这是成本与性能之间的最佳折衷。请不要在便宜或旧的SSD上尝试此操作。

交换+ SSD!对于高性能易失性存储,我强烈建议您尝试使用高交换值。它主要取决于内存访问模式(随机访问所有内存,而很少访问大多数内存),内存使用情况,磁盘带宽是否已饱和以及抖动的实际成本。


1

可能是在启动或打开程序时,许多可察觉的交换行为是linux从磁盘读取配置文件等。因此,最好在假定硬盘驱动器访问是由于交换导致的情况下使用系统监视器程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.