我在各种论坛上阅读了有关 swappiness 的内容,还看了一些视频。许多人表示,对于桌面用户来说,将 swappiness 值降低到 60 以下(默认值)是一件好事。有些人表示 60 对服务器来说很好。那么,为什么我最好降低它,为什么 60 对服务器来说很好呢?我试图寻找答案(我查找了这里例如),但无法理解。...请使用简单的术语:D
答案1
你的前提是错误的。不存在“对服务器有利”的 swapiness 值。
Swapiness 是交换量,特别是交换的积极程度。对于我的服务器,swapiness 接近于零,因为我要确保它们有足够的内存来处理所有事情。没有“最适合服务器”的值。有 60,这是默认值,然后有“您的值”,这取决于使用情况和可用内存。
如果您的服务器有时使用大量内存,您可以将它们设置为高于默认值,但我想说有些服务器(数据库服务器?)可能希望将它们设置为比家用计算机低得多的内存。
答案2
swappiness 值的缩放方式让人感到困惑。他们看到它的范围是 0-100,所以他们想到的是百分比,而实际上有效的最小值约为 50。
60 大致意味着在内存使用率达到 80% 之前不进行交换,留下 20% 用于缓存等。50 意味着等到内存用完为止。较低的值表示相同的意思,但会更积极地尝试通过其他方式释放内存。
答案3
swappiness 设置是对 Linux 在特定情况下计算交换优缺点的方式的调整。高 swappiness 不会导致系统在不需要时进行交换,而低 swappiness(前提是您没有完全禁用交换)不会阻止您的系统在绝对需要时进行交换。
默认的 swappiness 为 60 左右,是一个很好的折衷方案,可以确保在有未使用的分配程序内存时,系统不会过于费力地分配缓存内存,从而确保系统的良好性能。
请记住,如果您有足够的 RAM 供所有进程使用,再加上缓存(如果您有足够的物理 RAM,通常情况就是这样),那么交换对您来说就不是问题了。解决交换过多问题的首选方法是减少进程的 RAM 使用量,和/或增加物理 RAM。如果您真正需要的是更多 RAM,那么减少交换量将产生负面影响。
请参阅我针对一个非常相似的问题所写的答案:
https://askubuntu.com/a/184221/54256
摘抄:
为什么大多数人建议将 swappiness 降低到 10-20?
因为大多数人认为交换 = 坏事,如果不减少交换,系统就会在不需要时进行交换。这两种说法都不正确。人们把交换与系统陷入困境的时候联系在一起——然而,主要是交换因为系统陷入了困境,而不是相反。确实,在某些时候交换可能会产生明显的性能损失,但系统在决定交换时已经考虑到了这一点,并决定不这样做会对系统性能或稳定性造成更大的总体损失,这可能会在以后变得明显。总的来说,默认设置应该会带来最佳的整体性能和可靠性。我建议保留默认设置。
...
一旦使用了足够的内存,以致剩余的内存不足以支持平稳运行的缓存,Linux 可能会将一些未使用的应用程序内存从 RAM 重新分配到交换区。
不过,它并不是根据一个明确的截止点来执行此操作的。并不是说达到一定的分配百分比后 Linux 就开始交换。它有一个相当“模糊”的算法。它考虑了很多因素,可以用“内存分配压力有多大”来最好地描述。如果分配新内存的“压力”很大,那么就会增加一些内存被交换以腾出更多空间的机会。如果“压力”较小,那么就会减少这些机会。
您的系统有一个“swappiness”设置,可帮助您调整计算“压力”的方式。通常不建议更改它,我绝对不会建议您更改它。交换总体上是一件非常好的事情 - 任何偶尔的性能损失都旨在通过提高整个系统的响应能力和稳定性来抵消,以应对各种任务。如果您降低 swappiness,即使缓存可能真的有用,也会让缓存内存量比平时减少一点。因此,您可能会冒着降低计算机整体速度的风险,因为缓存较少,而内存被甚至不使用的应用程序占用。对于您在交换方面遇到的任何特定问题,这是否是一个足够好的权衡取决于您。如果您进一步禁用交换,则在系统耗尽进程内存的情况下,您可能会面临系统不稳定的风险。
当系统陷入停滞并发生大量交换时,会发生什么情况?
很多时候,人们会发现系统严重损坏磁盘并使用了大量交换空间,并把责任归咎于交换。这是错误的做法。如果交换达到这种极端情况,则意味着系统内存极低,而交换是防止系统崩溃或随机杀死进程的唯一方法。在这种情况下,如果没有交换,进程将崩溃并死亡。交换是更深层次问题的征兆。在一个拥有足够内存来执行所有任务的系统中,交换只能确保以高效的方式利用内存,将内存分配给缓存,而不是休眠进程,因为它认为这样做是值得的。在一个交换不断损坏磁盘的系统中,这不是交换的错。
在选择将哪些内容交换到磁盘时,系统会尝试选择实际上未使用的内存(读取或写入)。它有一个非常简单的算法来计算这一点,大多数时候都能做出正确的选择。
...
但是交换如何能加速我的系统呢?交换不会减慢系统速度吗?
将数据从 RAM 传输到交换区的操作很慢,但只有当内核确信整体收益大于此时才会执行此操作。例如,如果您的应用程序内存已上升到几乎没有缓存的程度,并且您的 I/O 也因此而效率低下,那么您可以通过释放一些内存来提高系统速度,即使在最初为了释放内存而交换数据之后,这样做也会带来一些开销。
答案4
Swappiness 与所有这些答案完全矛盾。
文章中描述了 swappiness 的实际工作原理: https://gokulvasanblog.wordpress.com/2016/11/14/empathising-mammoths-mentality-a-study-on-linux-memory-management/
安德鲁·莫顿 (Andrew Morton) 的声明证实了这种模糊性: https://lwn.net/Articles/83593/
我要用手指堵住耳朵唱“啦啦啦”,直到人们告诉我“我将 swappiness 设置为零,但它并没有按照我想要的方式运行”。
希望它有用