为什么大多数人建议将吞咽减少到10-20?

我已经在几个网站上看到过,建议将swappiness降低到10-20以获得更好的性能。

  • http://community.linuxmint.com/tutorial/view/998
  • https://sites.google.com/site/easylinuxtipsproject/bugs
  • http://www.howtogeek.com/115797/6-ways-to-speed-up-ubuntu/
  • http://www.upubuntu.com/2012/06/11-tips-to-speed-up-computers-running.html

这是一个神话吗? 这是一般规则吗? 我有一台配备4GB Ram和128GB SSD的笔记本电脑,你推荐我的swappiness有什么价值?

谢谢。

因为大多数人认为交换=坏,如果你不减少swappiness,系统将在它真正不需要时进行交换。 这些都不是真的。 人们将交换与他们的系统陷入困境的时间相关联 – 但是,它主要是交换, 因为系统陷入困境,而不是相反。 当系统交换时,它已经考虑了交换决策的性能成本,并决定不这样做会对系统性能或稳定性造成更大的总体损失,这可能会在以后变得明显。

总体而言,默认设置可带来良好的整体性能和稳定性。 我建议保留默认值。 可以对桌面/交互式系统上的交换如何工作进行改进,但总的来说,swappiness控制不是最佳解决方案 – 在一个方向上调整它,您可以修复一个问题并创建其他问题。 与简单地安装更多RAM相比,这相形见绌。

Linux如何使用RAM

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

如果您的应用程序将内存使用量增加到他们使用几乎所有RAM的程度,那么缓存将缩小,因此平均而言磁盘操作将会减慢。

如果应用程序进一步增加内存使用 – 假设您没有交换空间 – 最终会耗尽内存,系统将不得不终止进程。 杀戮过程比减速更糟,因为它会导致不稳定。

Linux如何使用swap

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

然而,这种重新分配不是根据确定的截止值完成的。 在Linux开始交换时,您没有达到一定的分配百分比。 它有一个“模糊”算法。 它需要考虑很多事情,最好用“内存分配的压力”来描述。 如果分配新内存有很多“压力”,那么它将增加一些交换机会以腾出更多空间。 如果“压力”较小,则会减少这些机会。

您的系统具有“swappiness”设置,可帮助您调整计算“压力”的方式。 通常不建议改变这一点。 交换总体上是一件非常好的事情 – 任何偶然的性能损失都会被整体系统响应性和各种任务的稳定性所增加所抵消。 如果你减少了swappiness,你可以让缓存内存量缩小一点,即使它真的很有用。 因此,您的整体计算机风险会降低。 如果你甚至完全禁用交换,那么由于无法分配内存而导致进程被杀死的风险。

当系统陷入困境并严重交换时会发生什么?

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

很多时候人们会看到他们的系统正在大量颠簸磁盘并使用大量的交换空间并且责备交换它。 这是错误的做法。 如果交换达到这个极端,则意味着交换是您的系统尝试处理低内存问题,而不是问题的原因。

桌面系统怎么样? 他们不需要采用不同的方法吗?

桌面系统的用户确实期望系统响应于诸如打开应用程序之类的用户启动的动作而“感觉到响应”,这是由于所需的存储器的增加有时会触发交换的动作类型。

尝试和调整它的一种方法是减少swappiness参数,这可以增加系统对使用高速内存和低缓存空间的应用程序的容忍度。

然而,在某种程度上,这只是转移门柱。 现在可以在没有交换操作的情况下加载应用程序,但是它会为下一个加载的应用程序留下更少的空间。 相反,当您下次打开应用程序时,可能会发生相同的交换。 与此同时,由于缓存大小减小,系统性能整体略低。 因此,降低的swappiness设置的任何好处可能难以测量,在某些时候减少交换延迟但在其他时间导致其他慢性能。 如果你知道你正在做什么,减少swappiness可能是合理的,但是应该谨慎地将它降低到10%,因为这可以使系统容忍非常低的高速缓存大小并使系统更容易受到影响。必须在短时间内交换。

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

到目前为止,最有效的补救措施是,如果你负担得起,可以安装更多内存。

是否可以在具有大量RAM的系统上禁用交换?

如果你有比你可能需要的应用程序更多的RAM,那么你很少需要交换。 在大多数情况下,禁用交换可能不会产生影响。 但是如果你有足够的RAM,那么保持交换启用也不会有任何损失,因为系统在不需要时不会交换。

产生影响的唯一情况是在不太可能的情况下系统发现自己的内存不足,因此缓存系统受到阻碍,并且在这种情况下你最需要交换。 因此,您可以安全地将交换保留在其正常设置上,以便在您有足够的内存时不会产生负面影响。

但是如何交换加速我的系统? 不会减慢交易速度吗?

将数据从RAM传输到交换的操作是一个缓​​慢的操作,但只有在内核非常确定由于保持合理的高速缓存大小而导致的整体优势将超过这一点时才会采取这种做法。

一旦数据处于交换状态,它何时再次出现?

任何给定的内存部分一旦使用就会从交换中恢复 – 读取或写入。 但是,通常交换的内存是长时间未访问的内存,预计不会很快需要。

从交换中传输数据与将数据放入其中一样耗时。 如果不需要,您的内核将不会从中删除数据。 虽然数据处于交换状态而未被使用,但它为正在使用的其他事物留下了更多内存,并且系统缓存更多。

在通常的桌面上,您有4-5个活动任务占用50-60%的内存。 如果将swappiness设置为60,则将换出约1 / 4-1 / 3的ACTIVE任务页面。 这意味着,对于每个任务更改,对于您打开的每个新选项卡,对于每个JS执行,都会有一个交换过程。

解决方案是将swappiness设置为10.通过实际观察,这会导致系统放弃磁盘缓存(在桌面上几乎没有任何作用,因为读/写缓存实际上根本没有使用。除非你经常复制LARGE文件)而不是把任何东西推入交换。 在实践中,这意味着系统将拒绝交换页面,而不是切换io缓存,除非它达到90%的已用内存。 而这反过来又意味着平滑,无交换,快速的桌面体验。

但是,在文件服务器上,我会将swappiness设置为60甚至更多,因为服务器没有巨大的活动前台任务,必须在整个内存中保存,而是许多较小的进程正在工作或hibernate,并没有立即改变他们的状态。 相反,服务器通常向客户端提供(赦免)完全相同的数据,使磁盘io缓存更有价值。 因此,在服务器上,更换hibernate进程,释放磁盘高速缓存请求的内存空间要好得多。

但是,在桌面上,这种确切的设置会导致换掉REAL应用程序的内存块,这些内存几乎不断地修改或访问这些数据。

奇怪的是,浏览器通常会保留大块内存,而不断修改。 当交换这些块时,如果请求它们需要一段时间 – 同时浏览器会更新其缓存。 这导致了巨大的延迟。 实际上,您将在2分钟内等待新标签页中的单个网页加载。

桌面并不真正关心磁盘io,因为桌面很少会读取和写入可缓存的重复大部分数据。 切换磁盘io以便尽可能地防止交换对桌面来说更有利于将30%的内存保留用于磁盘缓存而30%的RAM(完全属于主动使用的应用程序)被换出。

只需启动htop,打开浏览器,GIMP,LibreOffice – 在那里加载少量文档,然后浏览几个小时。 它真的那么容易。

如果你在Linux系统上运行一个Java服务器,你应该考虑从默认值60开始减少swappiness。所以20确实是一个好的开始。 交换是垃圾收集过程的杀手,因为每次收集都需要触摸进程内存的大部分内容。 操作系统没有办法检测这些过程并为他们做好准备。 最佳做法是尽可能避免为生产应用程序服务器进行交换。

我建议做一些实验,同时让系统监视器打开,看看你的机器有多少负载,我也运行4GB内存和128GB SSD,所以将swappiness值改为10,这不仅改善了负载下的性能,作为奖励也将增加SSD驱动器的寿命,因为它将遭受更少的写入。

有关如何执行完整说明的简单video教程,请参阅下面的YouTubevideo

http://youtu.be/i6WihsFKJ7Q

可能是在启动或打开程序时很多感知到的交换行为是从磁盘读取配置文件等。 因此,在假设硬盘访问是由于交换之前,最好先查看系统监控程序。

我想从大数据性能工程师那里添加一些观点,以便为其他人提供2017年技术的更多背景知识。

我个人的经验是,虽然我通常禁用交换以保证我的系统以最大速度运行,但在我的工作站上针对特定问题,我发现1和10的交换导致冻结(永远)和长时间暂停。 对于这个特定的应用程序,80的Swappiness导致比默认(60)更好的性能和更短的暂停。 请注意,我有8GB RAM和4x 256GB交换支持1个硬盘。 我通常会在我的基准测试和完整的硬件规格中说明精确的统计数据,但我还没有做过任何事情,这是最近在这里不重要的低端桌面。

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

今天,20年前和未来20年,仍然存在一些问题对于RAM而言太大的情况。 凭借无限的时间和金钱,我们可以购买/租赁更多硬件或重新设计任何流程,以使性能达到理想水平。 交换只是一个让我们忽略真正问题的黑客(我们没有足够的内存,我们不想花更多的钱)。

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

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