问题描述
我已经在几个网站上看到过,建议将swappiness降低到10-20以获得更好的性能。
这是一个神话吗?这是一般规则吗?我有一台配备4GB Ram和128GB SSD的笔记本电脑,你推荐我的swappiness有什么价值?
谢谢。
最佳解决方法
因为大多数人认为交换=坏,如果你不减少swappiness,系统将在它真正不需要时进行交换。这些都不是真的。人们将交换与他们的系统陷入困境的时间相关联 – 但是,它主要是交换,因为系统陷入困境,而不是相反。当系统交换时,它已经考虑了交换决策的性能成本,并决定不这样做会对系统性能或稳定性造成更大的总体损失,这可能会在以后变得明显。
总体而言,默认设置可带来良好的整体性能和稳定性。我建议保留默认值。可以对桌面/交互式系统上的交换如何工作进行改进,但总的来说,swappiness控制不是最佳解决方案 – 在一个方向上调整它,您可以修复一个问题并创建其他问题。与简单地安装更多RAM相比,这相形见绌。
Linux如何使用RAM
应用程序未使用的任何RAM都可以用作”cache”。缓存对于快速,平稳运行的系统非常重要,可以加快对磁盘的读写操作。
如果您的应用程序将内存使用量增加到他们使用几乎所有RAM的程度,那么缓存将缩小,因此平均而言磁盘操作将会减慢。
如果应用程序进一步增加内存使用 – 假设您没有交换空间 – 最终会耗尽内存,系统将不得不终止进程。杀戮过程比减速更糟,因为它会导致不稳定。
Linux如何使用swap
为了解决这两个问题,您的系统可以将re-allocate的一些seldom-used应用程序内存添加到磁盘上的交换空间,从而释放更多RAM。这可以防止由于内存不足而导致进程死亡,并且可以回收一点缓存,因此磁盘操作可以顺利运行。
然而,这个re-allocation不是根据明确的截止值完成的。在Linux开始交换时,您没有达到一定的分配百分比。它有一个”fuzzy”算法。它需要考虑很多事情,最好用“内存分配的压力”来描述。如果有很多”pressure”来分配新内存,那么它将增加一些交换机会以腾出更多空间。如果”pressure”少,那么它将减少这些机会。
您的系统具有”swappiness”设置,可帮助您调整”pressure”的计算方式。通常不建议改变这一点。交换总体上是一件非常好的事情 – 任何偶然的性能损失都会被整体系统响应性和各种任务的稳定性所增加所抵消。如果你减少了swappiness,你可以让缓存内存量缩小一点,即使它真的很有用。因此,您的整体计算机风险会降低。如果你甚至完全禁用交换,那么由于无法分配内存而导致进程被杀死的风险。
当系统陷入困境并严重交换时会发生什么?
交换是一个缓慢且昂贵的操作,因此系统会避免它,除非它计算出缓存性能中的trade-off将全面弥补它,或者是否有必要避免终止进程。
很多时候人们会看到他们的系统正在大量颠簸磁盘并使用大量的交换空间并且责备交换它。这是错误的做法。如果交换达到这个极端,则意味着交换是您的系统尝试处理低内存问题,而不是问题的原因。
桌面系统怎么样?他们不需要采用不同的方法吗?
桌面系统的用户确实期望系统响应于user-initiated操作(例如打开应用程序)而“感觉响应”,这是由于所需内存增加有时会触发交换的操作类型。
尝试和调整它的一种方法是减少swappiness参数,这可以增加系统对使用高速内存和低缓存空间的应用程序的容忍度。
然而,在某种程度上,这只是转移门柱。现在可以在没有交换操作的情况下加载应用程序,但是它会为下一个加载的应用程序留下更少的空间。相反,当您下次打开应用程序时,可能会发生相同的交换。与此同时,由于缓存大小减小,系统性能整体略低。因此,降低的swappiness设置的任何好处可能难以测量,在某些时候减少交换延迟但在其他时间导致其他慢性能。如果你知道你正在做什么,减少swappiness可能是合理的,但是应该谨慎地将它降低到10%,因为这可以使系统容忍非常低的高速缓存大小并使系统更容易受到影响。必须在短时间内交换。
应该避免完全禁用交换,因为您失去了对out-of-memory条件的额外保护,这可能导致进程崩溃或被终止。
到目前为止,最有效的补救措施是,如果你负担得起,可以安装更多内存。
是否可以在具有大量RAM的系统上禁用交换?
如果你有比你可能需要的应用程序更多的RAM,那么你很少需要交换。在大多数情况下,禁用交换可能不会产生影响。但是如果你有足够的RAM,那么保持交换启用也不会有任何损失,因为系统在不需要时不会交换。
它会产生影响的唯一情况是在不太可能的情况下系统发现自己的内存不足,因此缓存系统受到阻碍,并且在这种情况下你最需要交换。因此,您可以安全地将交换保留在其正常设置上,以便在您有足够的内存时不会产生负面影响。
但是如何交换加速我的系统?不会减慢交易速度吗?
将数据从RAM传输到交换的操作是一个缓慢的操作,但只有在内核非常确定由于保持合理的高速缓存大小而导致的整体优势将超过这一点时才会采取这种做法。
一旦数据处于交换状态,它何时再次出现?
任何给定的内存部分一旦使用就会从交换中恢复 – 读取或写入。但是,通常交换的内存是长时间未访问的内存,预计不会很快需要。
从交换中传输数据与将time-consuming放入其中一样。如果不需要,您的内核将不会从中删除数据。虽然数据处于交换状态而未被使用,但它为正在使用的其他事物留下了更多内存,并且系统缓存更多。
次佳解决方法
在通常的桌面上,您有4-5个活动任务占用50-60%的内存。如果将swappiness设置为60,则将换出约1 /4-1 /3的ACTIVE任务页面。这意味着,对于每个任务更改,对于您打开的每个新选项卡,对于每个JS执行,都会有一个交换过程。
解决方案是将swappiness设置为10.通过实际观察,这会导致系统放弃磁盘缓存(在桌面上几乎没有任何作用,因为读/写缓存实际上根本没有使用。除非你经常复制LARGE文件)而不是把任何东西推入交换。在实践中,这意味着系统将拒绝交换页面,而不是切换io缓存,除非它达到90%的已用内存。而这反过来又意味着平滑,无交换,快速的桌面体验。
但是,在文件服务器上,我会将swappiness设置为60甚至更多,因为服务器没有巨大的活动前台任务,必须在整个内存中保存,而是许多较小的进程正在工作或休眠,并没有立即改变他们的状态。相反,服务器通常向客户端提供(赦免)完全相同的数据,使磁盘io缓存更有价值。因此,在服务器上,更换休眠进程,释放磁盘高速缓存请求的内存空间要好得多。
但是,在桌面上,这种确切的设置会导致换掉REAL应用程序的内存块,这些内存几乎不断地修改或访问这些数据。
奇怪的是,浏览器通常会保留大块内存,而不断修改。当交换这些块时,如果请求它们需要一段时间 – 同时浏览器会更新其缓存。这导致了巨大的延迟。实际上,您将在2分钟内等待新标签页中的单个网页加载。
桌面并不真正关心磁盘io,因为桌面很少会读取和写入可缓存的重复大部分数据。切换磁盘io以便尽可能地防止交换对桌面来说更有利于将30%的内存保留用于磁盘缓存而30%的RAM(完全属于主动使用的应用程序)被换出。
只需启动htop,打开浏览器,GIMP,LibreOffice – 在那里加载少量文档,然后浏览几个小时。它真的那么容易。
第三种解决方法
如果你在Linux系统上运行一个Java服务器,你应该考虑从默认值60开始减少swappiness。所以20确实是一个好的开始。交换是垃圾收集过程的杀手,因为每次收集都需要触摸进程内存的大部分内容。操作系统没有办法检测这些过程并为他们做好准备。最佳做法是尽可能避免为生产应用程序服务器进行交换。
第四种方法
我建议做一些实验,同时让系统监视器打开,看看你的机器有多少负载,我也运行4GB内存和128GB SSD,所以将swappiness值改为10,这不仅改善了负载下的性能,作为奖励也将增加SSD驱动器的寿命,因为它将遭受更少的写入。
有关如何执行完整说明的简单视频教程,请参阅下面的YouTube视频