vm.swappiness 参数真正控制什么?

phe*_*mer 37 linux kernel memory swap

根据内核文档:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.
Run Code Online (Sandbox Code Playgroud)

然而,这有点模糊。我试图弄清楚参数最终控制什么。我知道它会调整内核尝试换出页面的积极程度,但它会影响内核代码中的哪些决策过程?

它是否会在内核将其换出之前调整页面必须在多长时间前被访问?如果是这样,默认值 60 代表什么?增加/减少 1 会改变多少(公式会很好)?
或者它是否根据访问频率换出页面?
或者是其他东西?

Tho*_*man 30

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

vm.swappiness选项在get_scan_count()定义中起作用mm/vmscan.cget_scan_count()确定在寻找要驱逐的页面时,应以多积极的方式扫描匿名和文件 LRU 列表。每个案例的值由最近轮换和最近扫描的比率的浮动平均值确定,其中较新的参考比旧的具有更大的权重,以便考虑系统不断变化的工作负载。

vm.swappiness是一个修改器,它改变了换出文件缓存页面以支持匿名页面之间的平衡。vm.swappiness是赋予匿名页面的优先级值,默认设置为 60。文件缓存的优先级值为 200,从中vm.swappiness扣除修饰符 ( file_prio=200-anon_prio)。这意味着,默认情况下,优先权重适度支持匿名页面 ( anon_prio=60, file_prio=200-60=140)。但是,当系统接近内存不足情况时,匿名和文件 LRU 列表都会被同等扫描,除非vm.swappiness设置为零。

vm.swappiness设置为 100 时,优先级将相等 ( anon_prio=100, file_prio=200-100=100)。设置vm.swappiness为零将防止内核从文件缓存中驱逐匿名页面以支持页面。


小智 13

有一个公式用于计算将交换的页面。在vmscan.c你可以看到这个算法:

交换趋势 = 映射比率 / 2 + 痛苦 + vm_swappiness

在这里您可以看到 swappiness 是一个比例,它是在某些算法中添加的,您可以通过此参数控制内核在必须交换时的行为方式。您可以将其计算为某个非活动内存页面将被交换的概率百分比。如果将 swappiness 设置为 100,则没有概率,但可以保证它会交换,如果将其设置为 0,则内核将尽量不进行交换,只要它有一些空内存。


msw*_*msw 6

有人说(我认为是 Norman 1986)电梯中的“CLOSE DOOR”按钮通常要么坏了,要么根本就没有连接到任何东西。这使得仿造控制不是操纵电梯的一种方式,而是安抚过度匆忙的乘客的方式。

以类似的方式,swappiness 的影响与其对内核谓词的明确定义的确定性控制无关。正如@neon_overlord 在 askubuntu.com 上指出的那样

因为大多数人认为交换=坏,并且如果您不减少交换,系统将在真正不需要时进行交换。这两个都不是真的。人们将交换与系统陷入困境的时间联系起来 - 然而,交换主要是因为系统陷入困境,而不是相反。确实,在某些时候交换会产生明显的损失,但是在这种情况下减少交换会以其他方式降低整体系统性能或稳定性,这些方式以后可能会变得明显……

那么它真正控制的是什么呢?一个有效的答案——除了已经提供的很好的答案之外——是它改变了你对系统有更多控制权的期望,并且转动旋钮将使你能够以一种有意义的方式施加这种控制。