为什么 swappiness 默认设置为 60?

为什么 swappiness 默认设置为 60?

我刚刚读了一些有关 Linux 上交换的内容。我不明白为什么默认设置为 60。

根据我的说法,这个参数应该设置为 10 以减少交换。交换位于我的硬盘上,因此它比我的内存慢得多。

他们为什么这样配置内核?

答案1

从内核 2.6.28 开始,Linux 使用拆分最近最少使用的(LRU)页面替换策略。具有文件系统源的页面(例如程序文本或共享库)属于文件缓存。没有文件系统支持的页面称为匿名页面,由运行时数据组成,例如为应用程序保留的堆栈空间等。通常,属于文件缓存的页面从内存中逐出的成本更低(因为这些页面可以在需要时简单地从磁盘读回) 。由于匿名页面没有文件系统支持,因此只要程序需要它们,它们就必须保留在内存中,除非有交换空间来存储它们。

这是一个常见的误解,认为交换分区会以某种方式减慢你的系统速度。没有交换分区并不意味着内核不会从内存中逐出页面,它只是意味着内核在逐出哪些页面方面的选择较少。可用交换量不会影响其使用量。

Linux 可以应对交换空间缺失的情况,因为默认情况下,内核内存统计策略可能会过度使用内存。缺点是当物理内存耗尽并且内核无法将匿名页面交换到磁盘时,内存不足杀手(OOM-killer)机制将开始杀死占用内存的“流氓”进程,为其他进程释放内存。

vm.swappinessoption 是一个修饰符,用于更改换出文件缓存页面以支持匿名页面之间的平衡。文件缓存被赋予任意优先级值 200,从中vm.swappiness扣除修饰符 ( file_prio=200-vm.swappiness)。默认情况下,匿名页面以 60 ( ) 开头anon_prio=vm.swappiness。这意味着,默认情况下,优先级权重适度支持匿名页面 ( anon_prio=60, file_prio=200-60=140)。该行为mm/vmscan.c在内核源代码树中定义。

给定 a vm.swappiness100优先级将相等 ( file_prio=200-100=100, anon_prio=100)。如果不希望文件缓存中的页面被逐出以支持匿名页面,那么这对于 I/O 密集型系统来说是有意义的。

相反,设置vm.swappiness0将阻止内核逐出匿名页面以支持文件缓存中的页面。如果程序自行完成大部分缓存(某些数据库可能就是这种情况),这可能会很有用。在桌面系统中,这可能会提高交互性,但缺点是 I/O 性能可能会受到影响。

默认值很可能被选为这两个极端之间的近似中间值。与任何性能参数一样,调整vm.swappiness应该基于与实际工作负载相当的基准数据,而不仅仅是直觉。

答案2

问题是没有一个默认值可以满足所有需求。将 swappiness 选项设置为 10 可能是适合桌面的设置,但默认值 60 可能更适合服务器。换句话说,交换性需要根据用例进行调整 - 桌面与服务器、应用程序类型等。

此外,Linux 内核使用内存作为磁盘缓存,否则 RAM 将不会被使用,这既不高效也不符合预期。将磁盘数据存储在缓存中意味着如果某个东西再次需要相同的数据,它很可能会从内存中获取。从那里获取数据比再次从磁盘获取数据要快得多。 swappiness 选项是一种机制,Linux 内核在多大程度上更愿意换出到磁盘以缩小磁盘缓存。应该从缓存中删除较旧的数据还是应该换出一些程序页面?

本文也可能对这个主题有一些启发。特别是如何估计交换趋势。

答案3

在上面的答案中添加更多细节。
随着我们越来越多地使用虚拟机,Linux 主机可能是这些云环境之一上的虚拟机。在示例 1 和 2 中,我们对正在运行的应用程序及其消耗的 RAM 量有了很好的了解。 3、没那么多

  • 示例 1
    一个高性能私有云(大多数银行会花费数百万美元购买的那种),其中磁盘由非常昂贵的存储阵列提供,并且具有非常好的 IO。该存储的一部分可能位于由 SSD 磁盘支持的 RAM(磁盘阵列中)中,并由带有主轴的常规磁盘支持。在这种情况下,VM 看到的磁盘可能仅比它可以访问的 RAM 慢一点。对于单个虚拟机来说,交换区和内存之间没有太大区别。
  • 示例 2
    与示例 1 相同,但您拥有数百、数千或更多虚拟机,而不是单个虚拟机。在这种情况下,我们发现服务器(管理程序)RAM 便宜且充足,而存储 RAM 昂贵(相对而言)。如果我们将 RAM 需求划分为 Hypervisor RAM 和由我们非常昂贵的存储阵列提供的 SWAP,我们会发现我们很快就使用了存储阵列中的所有 RAM,然后块由 SSD 提供服务,最后由主轴提供服务。突然间,一切都开始变得非常慢。在这种情况下,我们可能希望为 VM 分配大量 RAM(来自管理程序)并将 swappiness 设置为 0(仅交换以避免内存不足的情况),因为所有这些 vm 的累积效应将对 VM 的性能产生影响存储,将交换性设置得更高可能会带来明显的性能提升,因为将有更多未使用的 RAM,因为当前未交互的应用程序已(大部分)被换出。
  • 示例 3 可能配备 SSD 的现代笔记本电脑或台式机。内存要求被认为是未知的。用户将使用哪种浏览器,他们将打开多少个选项卡,他们是否还会编辑文档、RAW 图像或可能的视频,他们都会消耗 RAM。将 swappiness 设置为较低值并执行其他文件系统调整将意味着对 SSD 的写入较少,因此它的使用寿命会更长。

相关内容